diff options
| author | Petri Hienonen <petri.hienonen@gmail.com> | 2025-11-14 11:47:49 +0200 |
|---|---|---|
| committer | Petri Hienonen <petri.hienonen@gmail.com> | 2025-11-14 11:47:49 +0200 |
| commit | d41ac3c094f733a8038885de3400ed7558b2b878 (patch) | |
| tree | a9a7cd54900e0b0c66f3293f4ff6bc6ad5cbbec6 | |
| parent | 6ca89c37f84c6b1d63c869e6471d3570d51f63be (diff) | |
| download | housing-d41ac3c094f733a8038885de3400ed7558b2b878.tar.zst | |
Minor tuning
| -rw-r--r-- | README.adoc | 4 | ||||
| -rw-r--r-- | app/components.js | 36 | ||||
| -rw-r--r-- | app/dom.js | 6 | ||||
| -rw-r--r-- | app/main.js | 46 | ||||
| -rw-r--r-- | app/map.js | 9 | ||||
| -rw-r--r-- | app/models.js | 44 | ||||
| -rw-r--r-- | scrape/go.mod | 16 | ||||
| -rw-r--r-- | scrape/go.sum | 25 | ||||
| -rw-r--r-- | scrape/html.go | 151 | ||||
| -rw-r--r-- | scrape/main.go | 248 | ||||
| -rw-r--r-- | scrape/oikotie.html | 2016 |
11 files changed, 2463 insertions, 138 deletions
diff --git a/README.adoc b/README.adoc index fd1cc7b..6dccb53 100644 --- a/README.adoc +++ b/README.adoc @@ -69,6 +69,10 @@ go run main.go - Visual programming? Value function description with Javascript? - Notifications to user on new houses - Sharing via URL +- Tie the filters to the rest of the program +- Make scoring work +- Add historgram +- Make filters work == Analysis Data processing diff --git a/app/components.js b/app/components.js index cc08fb4..c952b08 100644 --- a/app/components.js +++ b/app/components.js @@ -666,9 +666,9 @@ export class Modal { children: house.images.slice(0, 3).map((src) => { // Wrap image in anchor tag that opens in new tab return Dom.a( + src, new DomOptions({ attributes: { - href: src, rel: "noopener noreferrer", target: "_blank", }, @@ -771,6 +771,8 @@ export class Modal { { label: "Living Area", value: `${house.livingArea} m²` }, { label: "District", value: house.district }, { label: "Rooms", value: house.rooms?.toString() ?? "N/A" }, + { label: "Lot Size", value: house.totalArea ? `${house.totalArea} m²` : "N/A" }, + { label: "Price per m²", value: house.pricePerSqm ? `${house.pricePerSqm} €` : "N/A" }, ]; for (const { label, value } of details) { const item = Dom.div( @@ -816,6 +818,38 @@ export class Modal { ), ); + frag.appendChild( + Dom.div( + new DomOptions({ + children: [ + Dom.span( + "Official Listing", + new DomOptions({ + styles: { + fontSize: "14px", + fontWeight: "bold", + marginBottom: "5px", + marginRight: "10px", + }, + }), + ), + Dom.a( + house.url, + new DomOptions({ + attributes: { + rel: "noopener noreferrer", + target: "_blank", + }, + styles: { color: "#0066cc", fontSize: "14px", wordBreak: "break-all" }, + }), + "Oikotie", + ), + ], + styles: { marginBottom: "20px" }, + }), + ), + ); + if (house.images?.length) { frag.appendChild(Modal.imageSection(house)); } @@ -121,10 +121,14 @@ export class Dom { /** * Create a `<a>` + * @param {string} url * @param {DomOptions} o + * @param {string|undefined} text */ - static a(o) { + static a(url, o, text) { const link = document.createElement("a"); + if (text) link.text = text; + link.href = url; Object.assign(link.style, o.styles); if (o.id) link.id = o.id; for (const cls of o.classes) link.classList.add(cls); diff --git a/app/main.js b/app/main.js index 9abb300..da52152 100644 --- a/app/main.js +++ b/app/main.js @@ -50,23 +50,13 @@ export class App { this.#filters, this.#weights, () => { - this.#filtered = this.collection?.houses.filter((h) => h.matchesFilters(this.#filters)); - const filteredIds = this.#filtered.map((h) => h.id); - this.#map.updateHouseVisibility(filteredIds); - - const stats = App.#getStats(this.#filtered); - this.#stats.replaceWith(stats); - this.#stats = stats; + this.#applyFiltersAndScoring(); }, (key, value) => { if (key in this.#weights) { this.#weights[/** @type {keyof Weights} */ (key)] = value; } - App.#recalculateScores(this.collection?.houses, this.#weights); - this.#map.updateHousesColor(this.#houseParameter); - const stats = App.#getStats(this.#filtered); - this.#stats.replaceWith(stats); - this.#stats = stats; + this.#applyFiltersAndScoring(); }, (param) => { this.#houseParameter = param; @@ -189,7 +179,9 @@ export class App { async #initialize(loading) { try { this.collection = await Collection.get(); - this.#filtered = this.collection.houses.slice(); + + App.#recalculateScores(this.collection.houses, this.#weights); + this.#filtered = this.collection.houses.filter((h) => h.matchesFilters(this.#filters)); this.#map.initialize(this.collection, this.#houseParameter, this.#areaParameter); this.#sidebar.updateDistricts(this.collection.houses); @@ -211,10 +203,34 @@ export class App { static #recalculateScores(houses, weights) { for (const h of houses) { h.scores.current = Math.round(ScoringEngine.calculate(h, weights)); + h.value = h.scores.current; } } /** + * Apply filters and recalculate scores + */ + #applyFiltersAndScoring() { + if (!this.collection) return; + + // First recalculate all scores with current weights + App.#recalculateScores(this.collection.houses, this.#weights); + + // Then apply filters + this.#filtered = this.collection.houses.filter((h) => h.matchesFilters(this.#filters)); + + // Update map with filtered houses and new scores + const filteredIds = this.#filtered.map((h) => h.id); + this.#map.updateHouseVisibility(filteredIds); + this.#map.updateHousesColor(this.#houseParameter); + + // Update statistics + const stats = App.#getStats(this.#filtered); + this.#stats.replaceWith(stats); + this.#stats = stats; + } + + /** * Update statistics display using DOM methods * @param {House[]} filtered */ @@ -223,14 +239,14 @@ export class App { new DomOptions({ children: [ Dom.strong(filtered.length.toString()), - document.createTextNode(" houses shown • Average score: "), + Dom.span(" houses shown • Average score: "), Dom.strong( (filtered.length ? Math.round(filtered.reduce((s, h) => s + h.scores.current, 0) / filtered.length) : 0 ).toString(), ), - document.createTextNode(" • Use weights sliders to adjust scoring"), + Dom.span(" • Use weights sliders to adjust scoring"), ], id: "stats", styles: { @@ -817,14 +817,17 @@ export class MapEl { * @param {AreaParam} param */ updateArea(param) { - const values = this.#collection?.statisticalAreas.map((area) => area.getValue(param)); + const values = this.#collection?.statisticalAreas + .map((area) => area.getValue(param)) + .filter((x) => !Number.isNaN(x)) + .sort(); const range = { max: Math.max(...values), min: Math.min(...values) }; const statAreaPolygons = this.svg.querySelectorAll("#statistical-areas polygon"); statAreaPolygons.forEach((polygon) => { const areaId = polygon.getAttribute("data-id"); const area = this.#collection?.statisticalAreas.find((a) => a.id === areaId); - if (area) { - const value = area.getValue(param); + const value = area?.getValue(param); + if (area && value && !Number.isNaN(value)) { const normalized = MapMath.normalize(value, range.min, range.max); polygon.setAttribute( "fill", diff --git a/app/models.js b/app/models.js index 8cd1b5e..b4584f7 100644 --- a/app/models.js +++ b/app/models.js @@ -238,11 +238,17 @@ export class Geospatial { * @param {number} [schoolDistance] * @param {number} [railwayDistance] */ - constructor(marketDistance = 0, schoolDistance = 0, railwayDistance = 0) { + constructor( + marketDistance = Number.POSITIVE_INFINITY, + schoolDistance = Number.POSITIVE_INFINITY, + railwayDistance = Number.POSITIVE_INFINITY, + ) { this.marketDistance = marketDistance; this.schoolDistance = schoolDistance; this.railwayDistance = railwayDistance; - // Removed: crimeRate, safetyIndex, s2StudentRatio + this.distanceTrain = Number.POSITIVE_INFINITY; + this.distanceLightRail = Number.POSITIVE_INFINITY; + this.distanceTram = Number.POSITIVE_INFINITY; } /** @param {GeospatialJson} data @returns {Geospatial} */ @@ -538,6 +544,8 @@ export class House { * @param {Scores} scores * @param {string[]} images * @param {Geospatial} [geospatial] + * @param {StatisticalArea|null} statisticalArea + * @param {string} url */ constructor( id, @@ -563,6 +571,9 @@ export class House { images = [], geospatial = new Geospatial(), value = 0, + statisticalArea = null, + url = "", + pricePerSqm = 0, ) { this.id = id; this.address = address; @@ -587,10 +598,9 @@ export class House { this.images = images; this.geospatial = geospatial; this.value = value; - this.distanceTrain = 0; - this.distanceLightRail = 0; - this.distanceTram = 0; - this.statisticalArea = null; + this.statisticalArea = statisticalArea; + this.url = url; + this.pricePerSqm = pricePerSqm; } /** @param {HouseParameter} param */ @@ -659,6 +669,10 @@ export class House { new Scores(0), data.images || [], new Geospatial(), + 0, + null, + data.url || "", + rawData.pricePerSqm || 0, ); } @@ -795,11 +809,11 @@ export class Collection { house.statisticalArea = this.#findStatisticalArea(house.coordinates); // Calculate transit distances - house.distanceTrain = this.#calculateMinDistanceToStations( + house.geospatial.distanceTrain = this.#calculateMinDistanceToStations( house.coordinates, this.trainStations, ); - house.distanceLightRail = this.#calculateMinDistanceToStations( + house.geospatial.distanceLightRail = this.#calculateMinDistanceToStations( house.coordinates, this.lightRailStops, ); @@ -1065,20 +1079,22 @@ export class ScoringEngine { } // Transit distances (closer is better, but not too close) - if (weights.distanceTrain > 0 && house.distanceTrain > 0) { - const trainScore = ScoringEngine.calculateTransitScore(house.distanceTrain); + if (weights.distanceTrain > 0 && house.geospatial.distanceTrain > 0) { + const trainScore = ScoringEngine.calculateTransitScore(house.geospatial.distanceTrain); score += trainScore * weights.distanceTrain; totalWeight += weights.distanceTrain; } - if (weights.distanceLightRail > 0 && house.distanceLightRail > 0) { - const lightRailScore = ScoringEngine.calculateTransitScore(house.distanceLightRail); + if (weights.distanceLightRail > 0 && house.geospatial.distanceLightRail > 0) { + const lightRailScore = ScoringEngine.calculateTransitScore( + house.geospatial.distanceLightRail, + ); score += lightRailScore * weights.distanceLightRail; totalWeight += weights.distanceLightRail; } - if (weights.distanceTram > 0 && house.distanceTram > 0) { - const tramScore = ScoringEngine.calculateTransitScore(house.distanceTram); + if (weights.distanceTram > 0 && house.geospatial.distanceTram > 0) { + const tramScore = ScoringEngine.calculateTransitScore(house.geospatial.distanceTram); score += tramScore * weights.distanceTram; totalWeight += weights.distanceTram; } diff --git a/scrape/go.mod b/scrape/go.mod index c7a1086..bec6e3f 100644 --- a/scrape/go.mod +++ b/scrape/go.mod @@ -3,6 +3,12 @@ module tammi.cc/housing go 1.25.2 require ( + github.com/minio/minio-go/v7 v7.0.95 + golang.org/x/net v0.47.0 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/go-ini/ini v1.67.0 // indirect github.com/goccy/go-json v0.10.5 // indirect @@ -11,12 +17,12 @@ require ( github.com/klauspost/cpuid/v2 v2.2.11 // indirect github.com/minio/crc64nvme v1.0.2 // indirect github.com/minio/md5-simd v1.1.2 // indirect - github.com/minio/minio-go/v7 v7.0.95 // indirect github.com/philhofer/fwd v1.2.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rs/xid v1.6.0 // indirect github.com/tinylib/msgp v1.3.0 // indirect - golang.org/x/crypto v0.39.0 // indirect - golang.org/x/net v0.41.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/text v0.26.0 // indirect + golang.org/x/crypto v0.44.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/text v0.31.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/scrape/go.sum b/scrape/go.sum index 9fdb97e..dde91de 100644 --- a/scrape/go.sum +++ b/scrape/go.sum @@ -1,3 +1,5 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= @@ -19,15 +21,22 @@ github.com/minio/minio-go/v7 v7.0.95 h1:ywOUPg+PebTMTzn9VDsoFJy32ZuARN9zhB+K3IYE github.com/minio/minio-go/v7 v7.0.95/go.mod h1:wOOX3uxS334vImCNRVyIDdXX9OsXDm89ToynKgqUKlo= github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= -golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= -golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= -golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= -golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/crypto v0.44.0 h1:A97SsFvM3AIwEEmTBiaxPPTYpDC47w720rdiiUvgoAU= +golang.org/x/crypto v0.44.0/go.mod h1:013i+Nw79BMiQiMsOPcVCB5ZIJbYkerPrGnOa00tvmc= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/scrape/html.go b/scrape/html.go new file mode 100644 index 0000000..a1d1bbe --- /dev/null +++ b/scrape/html.go @@ -0,0 +1,151 @@ +package main + +import ( + "encoding/json" + "fmt" + "log" + "os" + "strings" + + "golang.org/x/net/html" +) + +type PropertyField struct { + Title string `json:"title"` + Value string `json:"value"` +} + +type PropertySection struct { + Section string `json:"section"` + Fields []PropertyField `json:"fields"` +} + +func test() { + // Read the HTML file + htmlContent, err := os.ReadFile("oikotie.html") + if err != nil { + log.Fatal("Error reading file:", err) + } + + // Parse the HTML + sections, err := parsePropertyHTML(string(htmlContent)) + if err != nil { + log.Fatal("Error parsing HTML:", err) + } + + // Convert to JSON + jsonData, err := json.MarshalIndent(sections, "", " ") + if err != nil { + log.Fatal("Error marshaling JSON:", err) + } + + // Write to file + err = os.WriteFile("property_data.json", jsonData, 0644) + if err != nil { + log.Fatal("Error writing JSON file:", err) + } + + fmt.Println("Successfully parsed property data and saved to property_data.json") +} + +func parsePropertyHTML(htmlContent string) ([]PropertySection, error) { + doc, err := html.Parse(strings.NewReader(htmlContent)) + if err != nil { + return nil, err + } + + var sections []PropertySection + var currentSection *PropertySection + + // Recursive function to traverse the HTML nodes + var traverse func(*html.Node) + traverse = func(n *html.Node) { + if n.Type == html.ElementNode { + // Check for section headers + if n.Data == "h3" && hasClass(n, "heading") && hasClass(n, "heading--title-2") { + if currentSection != nil && len(currentSection.Fields) > 0 { + sections = append(sections, *currentSection) + } + + sectionName := extractText(n) + currentSection = &PropertySection{ + Section: sectionName, + Fields: []PropertyField{}, + } + } + + // Check for info table rows + if n.Data == "div" && hasClass(n, "info-table__row") { + if currentSection != nil { + field := parseInfoTableRow(n) + if field.Title != "" { + currentSection.Fields = append(currentSection.Fields, field) + } + } + } + } + + // Traverse child nodes + for c := n.FirstChild; c != nil; c = c.NextSibling { + traverse(c) + } + } + + traverse(doc) + + // Don't forget to add the last section + if currentSection != nil && len(currentSection.Fields) > 0 { + sections = append(sections, *currentSection) + } + + return sections, nil +} + +func parseInfoTableRow(n *html.Node) PropertyField { + var field PropertyField + + var traverseRow func(*html.Node) + traverseRow = func(node *html.Node) { + if node.Type == html.ElementNode { + if node.Data == "dt" && hasClass(node, "info-table__title") { + field.Title = extractText(node) + } + if node.Data == "dd" && hasClass(node, "info-table__value") { + field.Value = extractText(node) + } + } + + for c := node.FirstChild; c != nil; c = c.NextSibling { + traverseRow(c) + } + } + + traverseRow(n) + return field +} + +func hasClass(n *html.Node, className string) bool { + for _, attr := range n.Attr { + if attr.Key == "class" && strings.Contains(attr.Val, className) { + return true + } + } + return false +} + +func extractText(n *html.Node) string { + var text strings.Builder + + var extract func(*html.Node) + extract = func(node *html.Node) { + if node.Type == html.TextNode { + text.WriteString(node.Data) + } + for c := node.FirstChild; c != nil; c = c.NextSibling { + extract(c) + } + } + + extract(n) + return strings.TrimSpace(text.String()) +} diff --git a/scrape/main.go b/scrape/main.go index 7ef5ce4..fed0397 100644 --- a/scrape/main.go +++ b/scrape/main.go @@ -19,10 +19,6 @@ import ( "github.com/minio/minio-go/v7/pkg/credentials" ) -// --------------------------------------------------------------------- -// 1. CONFIG & HELPERS -// --------------------------------------------------------------------- - type Config struct { CouchURL string CouchDB string @@ -46,10 +42,6 @@ func getEnvBool(key string, def bool) bool { return def } -// --------------------------------------------------------------------- -// 2. S3 / MINIO CLIENT (public bucket – no keys) -// --------------------------------------------------------------------- - type S3Client struct { client *minio.Client bucket string @@ -62,44 +54,53 @@ func NewS3Client(endpoint, bucket string, useSSL bool) (*S3Client, error) { Secure: useSSL, }) if err != nil { - return nil, err + return nil, fmt.Errorf("minio client creation failed: %w", err) } ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() exists, err := c.BucketExists(ctx, bucket) - if err != nil || !exists { - return nil, fmt.Errorf("bucket %s not accessible", bucket) + if err != nil { + return nil, fmt.Errorf("bucket check failed: %w", err) + } + if !exists { + return nil, fmt.Errorf("bucket %s does not exist", bucket) } return &S3Client{client: c, bucket: bucket}, nil } // UploadFromURL downloads a remote image, puts it in the bucket and returns the public URL func (s *S3Client) UploadFromURL(imgURL, key string) (string, error) { + log.Printf("Downloading image: %s", imgURL) resp, err := http.Get(imgURL) if err != nil { - return "", err + return "", fmt.Errorf("HTTP GET failed: %w", err) } defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { - return "", fmt.Errorf("img status %d", resp.StatusCode) + return "", fmt.Errorf("image download failed with status %d", resp.StatusCode) } + data, err := io.ReadAll(resp.Body) if err != nil { - return "", err + return "", fmt.Errorf("reading response body failed: %w", err) } - _, err = s.client.PutObject(context.Background(), s.bucket, key, bytes.NewReader(data), int64(len(data)), minio.PutObjectOptions{ + + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + _, err = s.client.PutObject(ctx, s.bucket, key, bytes.NewReader(data), int64(len(data)), minio.PutObjectOptions{ ContentType: "image/webp", }) if err != nil { - return "", err + return "", fmt.Errorf("S3 upload failed: %w", err) } - return fmt.Sprintf("https://%s/%s/%s", s.client.EndpointURL().Host, s.bucket, key), nil + + publicURL := fmt.Sprintf("https://%s/%s/%s", s.client.EndpointURL().Host, s.bucket, key) + log.Printf("Successfully uploaded image: %s", publicURL) + return publicURL, nil } -// --------------------------------------------------------------------- -// 3. HOUSE MODEL -// --------------------------------------------------------------------- - type House struct { ID string `json:"_id"` Rev string `json:"_rev,omitempty"` @@ -113,10 +114,6 @@ type House struct { ScrapedAt time.Time `json:"scraped_at"` } -// --------------------------------------------------------------------- -// 4. COUCHDB CLIENT (simplified – only Upsert) -// --------------------------------------------------------------------- - type CouchClient struct { baseURL string database string @@ -132,33 +129,41 @@ func NewCouchClient(base, db string) *CouchClient { } func (c *CouchClient) Upsert(h *House) error { - body, _ := json.Marshal(h) - reqURL := fmt.Sprintf("%s/%s/%s", c.baseURL, c.database, h.ID) - req, _ := http.NewRequest("PUT", reqURL, bytes.NewReader(body)) + body, err := json.Marshal(h) + if err != nil { + return fmt.Errorf("JSON marshal failed: %w", err) + } + + reqURL := fmt.Sprintf("%s/%s/%s", c.baseURL, c.database, url.PathEscape(h.ID)) + req, err := http.NewRequest("PUT", reqURL, bytes.NewReader(body)) + if err != nil { + return fmt.Errorf("request creation failed: %w", err) + } + req.Header.Set("Content-Type", "application/json") req.Header.Set("Accept", "application/json") resp, err := c.client.Do(req) if err != nil { - return err + return fmt.Errorf("HTTP request failed: %w", err) } defer resp.Body.Close() + if resp.StatusCode != http.StatusCreated && resp.StatusCode != http.StatusOK { - b, _ := io.ReadAll(resp.Body) - return fmt.Errorf("couch %d: %s", resp.StatusCode, string(b)) + body, _ := io.ReadAll(resp.Body) + return fmt.Errorf("couchDB responded with status %d: %s", resp.StatusCode, string(body)) } + var rev struct { Rev string `json:"rev"` } - json.NewDecoder(resp.Body).Decode(&rev) + if err := json.NewDecoder(resp.Body).Decode(&rev); err != nil { + return fmt.Errorf("decoding response failed: %w", err) + } h.Rev = rev.Rev return nil } -// --------------------------------------------------------------------- -// 5. OIKOTIE SCRAPER (single struct – everything in main.go) -// --------------------------------------------------------------------- - type OikotieScraper struct { client *http.Client s3 *S3Client @@ -179,8 +184,7 @@ func NewOikotieScraper(s3 *S3Client) *OikotieScraper { } } -// ---- token handling ------------------------------------------------- -func (osi *OikotieScraper) loadTokens() { +func (osi *OikotieScraper) loadTokens() error { osi.otaToken = getEnv("OTA_TOKEN", "") osi.otaCuid = getEnv("OTA_CUID", "") osi.otaLoaded = getEnv("OTA_LOADED", "") @@ -189,94 +193,132 @@ func (osi *OikotieScraper) loadTokens() { if osi.otaToken == "" || osi.otaCuid == "" || osi.otaLoaded == "" || osi.phpSessID == "" { log.Println("Missing one or more tokens – please enter them now:") r := bufio.NewReader(os.Stdin) + if osi.otaToken == "" { fmt.Print("OTA-token: ") - osi.otaToken, _ = r.ReadString('\n') - osi.otaToken = strings.TrimSpace(osi.otaToken) + token, err := r.ReadString('\n') + if err != nil { + return fmt.Errorf("reading OTA-token failed: %w", err) + } + osi.otaToken = strings.TrimSpace(token) } + if osi.otaCuid == "" { fmt.Print("OTA-cuid: ") - osi.otaCuid, _ = r.ReadString('\n') - osi.otaCuid = strings.TrimSpace(osi.otaCuid) + cuid, err := r.ReadString('\n') + if err != nil { + return fmt.Errorf("reading OTA-cuid failed: %w", err) + } + osi.otaCuid = strings.TrimSpace(cuid) } + if osi.otaLoaded == "" { fmt.Print("OTA-loaded: ") - osi.otaLoaded, _ = r.ReadString('\n') - osi.otaLoaded = strings.TrimSpace(osi.otaLoaded) + loaded, err := r.ReadString('\n') + if err != nil { + return fmt.Errorf("reading OTA-loaded failed: %w", err) + } + osi.otaLoaded = strings.TrimSpace(loaded) } + if osi.phpSessID == "" { fmt.Print("PHPSESSID: ") - osi.phpSessID, _ = r.ReadString('\n') - osi.phpSessID = strings.TrimSpace(osi.phpSessID) + sessID, err := r.ReadString('\n') + if err != nil { + return fmt.Errorf("reading PHPSESSID failed: %w", err) + } + osi.phpSessID = strings.TrimSpace(sessID) } } + return nil } -// ---- main scrape loop ----------------------------------------------- func (os *OikotieScraper) ScrapeAll(ctx context.Context, couch *CouchClient) error { - os.loadTokens() + if err := os.loadTokens(); err != nil { + return fmt.Errorf("loading tokens failed: %w", err) + } limit := 24 offset := 0 totalSaved := 0 + retryCount := 0 + maxRetries := 3 for { select { case <-ctx.Done(): + log.Println("Context cancelled, stopping scrape") return ctx.Err() case <-os.rateLimiter: + log.Printf("Fetching page with offset %d, limit %d", offset, limit) cards, found, err := os.fetchPage(offset, limit) if err != nil { if strings.Contains(err.Error(), "401") { - log.Println("401 – re-entering tokens") - os.loadTokens() + log.Println("401 Unauthorized – re-entering tokens") + if err := os.loadTokens(); err != nil { + return fmt.Errorf("reloading tokens failed: %w", err) + } + retryCount++ + if retryCount > maxRetries { + return fmt.Errorf("max retries reached for authentication") + } continue } - log.Printf("fetch error (offset %d): %v", offset, err) + + log.Printf("Fetch error (offset %d): %v", offset, err) + retryCount++ + if retryCount > maxRetries { + return fmt.Errorf("max retries reached for fetching") + } time.Sleep(5 * time.Second) continue } + + retryCount = 0 // Reset retry count on successful fetch if len(cards) == 0 { - log.Printf("No cards at offset %d – finished", offset) - break + log.Printf("No cards found at offset %d – finished scraping", offset) + return nil } - for _, c := range cards { + savedInBatch := 0 + for i, c := range cards { + log.Printf("Processing card %d/%d: %s", i+1, len(cards), c.ID) h, err := os.convertCard(c) if err != nil { - log.Printf("convert error %s: %v", c.ID, err) + log.Printf("Convert error for card %s: %v", c.ID, err) continue } if err := couch.Upsert(h); err != nil { - log.Printf("couch upsert %s: %v", h.ID, err) + log.Printf("CouchDB upsert failed for %s: %v", h.ID, err) } else { totalSaved++ + savedInBatch++ } } - log.Printf("offset %d-%d → %d new (total %d/%d)", offset, offset+len(cards)-1, len(cards), totalSaved, found) + log.Printf("Batch %d-%d: %d/%d cards saved (total: %d, found: %d)", + offset, offset+len(cards)-1, savedInBatch, len(cards), totalSaved, found) if offset+len(cards) >= found { - log.Printf("Reached end – %d cards saved", totalSaved) - break + log.Printf("Reached end of results – %d cards saved in total", totalSaved) + return nil } offset += limit } } - return nil } -// ---- API call -------------------------------------------------------- +// Fixed: cardId can be number or string, so use json.Number type apiCard struct { - ID string `json:"cardId"` - Type int `json:"cardType"` - SubType int `json:"cardSubType"` - URL string `json:"url"` - Status int `json:"status"` - Data json.RawMessage - Location json.RawMessage - Company json.RawMessage + ID json.Number `json:"cardId"` + Type int `json:"cardType"` + SubType int `json:"cardSubType"` + URL string `json:"url"` + Status int `json:"status"` + Data json.RawMessage `json:"data"` + Location json.RawMessage `json:"location"` + Company json.RawMessage `json:"company"` Medias []struct { ImageMobileWebPx2 string `json:"imageMobileWebPx2"` } `json:"medias"` @@ -294,9 +336,11 @@ func (os *OikotieScraper) fetchPage(offset, limit int) ([]apiCard, int, error) { q.Add("sortBy", "published_sort_desc") reqURL := os.baseURL + "?" + q.Encode() - req, _ := http.NewRequest("GET", reqURL, nil) + req, err := http.NewRequest("GET", reqURL, nil) + if err != nil { + return nil, 0, fmt.Errorf("creating request failed: %w", err) + } - // ---- headers ---------------------------------------------------- req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:144.0) Gecko/20100101 Firefox/144.0") req.Header.Set("Accept", "application/json, text/plain, */*") req.Header.Set("Referer", "https://asunnot.oikotie.fi/myytavat-asunnot?pagination=1&locations=%5B%5B64,6,%22Helsinki%22%5D%5D&cardType=100&buildingType%5B%5D=4&buildingType%5B%5D=8&buildingType%5B%5D=32&buildingType%5B%5D=128&buildingType%5B%5D=64&buildingType%5B%5D=512") @@ -307,7 +351,7 @@ func (os *OikotieScraper) fetchPage(offset, limit int) ([]apiCard, int, error) { resp, err := os.client.Do(req) if err != nil { - return nil, 0, err + return nil, 0, fmt.Errorf("HTTP request failed: %w", err) } defer resp.Body.Close() @@ -315,30 +359,40 @@ func (os *OikotieScraper) fetchPage(offset, limit int) ([]apiCard, int, error) { return nil, 0, fmt.Errorf("401 Unauthorized") } if resp.StatusCode != 200 { - b, _ := io.ReadAll(resp.Body) - return nil, 0, fmt.Errorf("status %d: %s", resp.StatusCode, string(b)) + body, _ := io.ReadAll(resp.Body) + return nil, 0, fmt.Errorf("status %d: %s", resp.StatusCode, string(body)) } var payload struct { Found int `json:"found"` Cards []apiCard `json:"cards"` } - if err := json.NewDecoder(resp.Body).Decode(&payload); err != nil { - return nil, 0, err + + // Read the body first for better error reporting + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, 0, fmt.Errorf("reading response body failed: %w", err) + } + + if err := json.Unmarshal(body, &payload); err != nil { + log.Printf("Raw response: %s", string(body)) + return nil, 0, fmt.Errorf("JSON unmarshal failed: %w", err) } return payload.Cards, payload.Found, nil } -// ---- conversion ------------------------------------------------------- func (os *OikotieScraper) convertCard(c apiCard) (*House, error) { + // Convert json.Number to string for the ID + cardID := c.ID.String() + h := &House{ - ID: "oikotie_" + c.ID, + ID: "oikotie_" + cardID, Source: "oikotie", - URL: "https://asunnot.oikotie.fi" + c.URL, + URL: c.URL, Status: c.Status, Type: c.Type, SubType: c.SubType, - ScrapedAt: time.Now(), + ScrapedAt: time.Now().UTC(), Raw: map[string]json.RawMessage{ "data": c.Data, "location": c.Location, @@ -346,7 +400,7 @@ func (os *OikotieScraper) convertCard(c apiCard) (*House, error) { }, } - // ---- images → download → S3 → store public URL -------------------- + // Process images for i, m := range c.Medias { if m.ImageMobileWebPx2 == "" { continue @@ -354,19 +408,20 @@ func (os *OikotieScraper) convertCard(c apiCard) (*House, error) { key := fmt.Sprintf("%s/img_%d.webp", h.ID, i) publicURL, err := os.s3.UploadFromURL(m.ImageMobileWebPx2, key) if err != nil { - log.Printf("image upload failed %s: %v", key, err) + log.Printf("Image upload failed for %s: %v", key, err) continue } h.Images = append(h.Images, publicURL) } + + log.Printf("Successfully converted card %s with %d images", cardID, len(h.Images)) return h, nil } -// --------------------------------------------------------------------- -// 6. MAIN -// --------------------------------------------------------------------- - func main() { + log.SetFlags(log.LstdFlags | log.Lshortfile) + log.Println("Starting Oikotie scraper...") + cfg := Config{ CouchURL: getEnv("COUCHDB_URL", "https://couch.tammi.cc"), CouchDB: getEnv("COUCHDB_DATABASE", "asunnot"), @@ -375,21 +430,32 @@ func main() { S3UseSSL: getEnvBool("S3_USE_SSL", true), } + log.Printf("Configuration: CouchDB=%s, S3=%s/%s", cfg.CouchURL, cfg.S3Endpoint, cfg.S3Bucket) + s3, err := NewS3Client(cfg.S3Endpoint, cfg.S3Bucket, cfg.S3UseSSL) if err != nil { - log.Fatal("S3 init:", err) + log.Fatalf("S3 initialization failed: %v", err) } + log.Println("S3 client initialized successfully") couch := NewCouchClient(cfg.CouchURL, cfg.CouchDB) + log.Println("CouchDB client initialized successfully") scraper := NewOikotieScraper(s3) + log.Println("Oikotie scraper initialized successfully") ctx, cancel := context.WithCancel(context.Background()) defer cancel() - log.Println("Starting full Oikotie scrape …") + // Handle graceful shutdown + go func() { + <-ctx.Done() + log.Println("Shutting down...") + }() + + log.Println("Starting full Oikotie scrape...") if err := scraper.ScrapeAll(ctx, couch); err != nil { - log.Fatal("scrape failed:", err) + log.Fatalf("Scrape failed: %v", err) } - log.Println("All done!") -} + log.Println("Scraping completed successfully!") +}
\ No newline at end of file diff --git a/scrape/oikotie.html b/scrape/oikotie.html new file mode 100644 index 0000000..9e5351f --- /dev/null +++ b/scrape/oikotie.html @@ -0,0 +1,2016 @@ +<!doctype html> +<html class="no-js" lang="fi" xmlns="http://www.w3.org/1999/html"> +<head> + <meta charset="utf-8"/> +<meta name="viewport" + content="width=device-width, initial-scale=1.0, user-scalable=yes, viewport-fit=cover"/> +<base href="/"/> +<title>78,5 m² Sarvastonkaari 3 G, 00840 Helsinki Paritalo 3h myynnissä - Oikotie 23911499</title><link rel="preconnect" href="https://sso.oikotie.fi"><link rel="preconnect" href="https://static.oikotiecdn.fi"><link rel="preconnect" href="https://connect.facebook.net"><link rel="preconnect" href="https://cmp.oikotie.fi"><link rel="preconnect" href="https://www.googletagmanager.com"><link rel="preload" href="https://cdn.asunnot.oikotie.fi/fonts/roboto/roboto-300-latin.woff2?e07df" as="font" type="font/woff2" crossorigin><link rel="preload" href="https://cdn.asunnot.oikotie.fi/fonts/roboto/roboto-400-latin.woff2?e07df" as="font" type="font/woff2" crossorigin><link rel="preload" href="https://cdn.asunnot.oikotie.fi/fonts/roboto/roboto-600-latin.woff2?e07df" as="font" type="font/woff2" crossorigin><link rel="preload" href="https://cdn.asunnot.oikotie.fi/fonts/roboto/roboto-700-latin.woff2?e07df" as="font" type="font/woff2" crossorigin><link rel="preload" href="https://static.oikotiecdn.fi/cmp/cmp.bundle.js" as="script"><link rel="preload" href="https://securepubads.g.doubleclick.net/tag/js/gpt.js" as="script" crossorigin><link rel="preload" href="https://connect.facebook.net/fi_FI/sdk.js" as="script"><link rel="preload" href="https://static.oikotiecdn.fi/schibsted-account/ot-session-widget.min.js" as="script"><link rel="preload" href="https://cdn.asunnot.oikotie.fi/fonts/icons/ot-icons.woff2?67uygh" as="font" type="font/woff2" crossorigin><link rel="preload" href="https://cdn.asunnot.oikotie.fi/fonts/icons/OT5.woff2?o4ppqp" as="font" type="font/woff2" crossorigin><script> + window.FACEBOOK_APP_ID = '341330689243807'; + window.URL_FRONT = 'https://asunnot.oikotie.fi'; +</script> +<meta name="robots" content="max-image-preview:large"><script>window.user={"user_id":0,"userkey":null,"customerType":null};</script> +<meta name="title" content="78,5 m² Sarvastonkaari 3 G, 00840 Helsinki Paritalo 3h myynnissä - Oikotie 23911499"/> +<meta name="description" content="Katso 37 kuvaa tästä 305000 €, 3h, avok. kph, s (yj. mukaan 3h+k+s), 78.5 m² Asunnot vuodelta 1978"/> +<link href="https://asunnot.oikotie.fi/myytavat-asunnot/helsinki/23911499" rel="canonical" /> +<!-- Twitter --> +<meta name="twitter:site" content="@OikotieAsunnot" /> +<meta name="twitter:image" content="https://cdn.asunnot.oikotie.fi/mBalKU6Dg4QU9t8EQspJdWkubYc=/full-fit-in/1536x1024/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/018/901/source/225109810" /> +<meta name="twitter:title" content="78,5 m² Sarvastonkaari 3 G, 00840 Helsinki Paritalo ..." /> +<meta name="twitter:description" content="Katso 37 kuvaa tästä 305000 €, 3h, avok. kph, s (yj. mukaan 3h+k+s), 78.5 m² Asunnot vuodelta 1978" /> +<meta name="twitter:card" content="summary_large_image"/> +<!-- Facebook --> +<meta property="fb:admins" content="620199225" /> +<meta property="fb:app_id" content="341330689243807" /> +<meta property="fb:pages" content="216829981720793" /> +<meta property="fb:pages" content="121059391307562" /> +<meta property="fb:pages" content="199704133386742" /> +<meta property="og:url" content="https://asunnot.oikotie.fi/myytavat-asunnot/helsinki/23911499?ref=fb" /> +<meta property="og:title" content="78,5 m² Sarvastonkaari 3 G, 00840 Helsinki Paritalo 3h my..." /> +<meta property="og:description" content="Katso 37 kuvaa tästä 305000 €, 3h, avok. kph, s (yj. mukaan 3h..." /> +<meta property="og:site_name" content="Oikotie.fi" /> +<meta property="og:locale" content="fi_FI" /> +<meta property="og:image" content="https://cdn.asunnot.oikotie.fi/mBalKU6Dg4QU9t8EQspJdWkubYc=/full-fit-in/1536x1024/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/018/901/source/225109810" /> +<meta property="og:type" content="website"> +<meta property="og:postal_code" content="00840"> +<meta property="og:locale" content="fi_FI"> +<meta property="og:street-address" content="Sarvastonkaari 3, 00840, Helsinki"> +<meta property="og:region" content="Helsinki"> + <meta property="og:locality" content="Laajasalo, Hevossalmi, Laajasalo, Itä-Helsinki, Kaakkoinen, Itäinen"> +<meta property="og:country_name" content="Suomi"> +<meta property="og:image" content="https://cdn.asunnot.oikotie.fi/Vu3oBX582FnoyvxrEvlwbceZQ00=/1536x1024/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/018/901/source/225109810"> +<script type="application/ld+json">{"@context":"https://schema.org","@type":["Product","Apartment"],"name":"3h, avok. kph, s (yj. mukaan 3h+k+s) | Oikotie","url":"https://asunnot.oikotie.fi/myytavat-asunnot/helsinki/23911499","description":"Katso 37 kuvaa tästä 305000 €, 3h, avok. kph, s (yj. mukaan 3h+k+s), 78.5 m² Asunnot vuodelta 1978","numberOfRooms":3,"floorSize":{"@type":"QuantitativeValue","unitCode":"MTK","unitText":"m²","value":78.5},"petsAllowed":null,"image":"https://cdn.asunnot.oikotie.fi/Vu3oBX582FnoyvxrEvlwbceZQ00=/1536x1024/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/018/901/source/225109810","itemCondition":{"@type":"OfferItemCondition","name":"Tyydyttävä"},"identifier":"21055475","address":{"@type":"PostalAddress","addressCountry":"Suomi","addressRegion":"Helsinki","postalCode":"00840","streetAddress":"Sarvastonkaari 3, 00840, Helsinki","addressLocality":"Laajasalo, Hevossalmi, Laajasalo, Itä-Helsinki, Kaakkoinen, Itäinen"},"geo":{"@type":"GeoCoordinates","latitude":"60.167446053319","longitude":"25.05309710345"},"sku":23911499,"ProductId":23911499,"offers":{"@type":"Offer","businessFunction":"https://purl.org/goodrelations/v1#Sell","price":305000,"priceCurrency":"EUR","seller":{"@type":"Person","name":"Pia Lundenberg","jobTitle":"myyntipäällikkö, asuntomyyjä, KED, partner ","image":"https://cdn.asunnot.oikotie.fi/bDQ9y4IaKxoFFd2x6Q7cbficors=/360x360/smart/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/977/910/source/223019779","telephone":"040 522 1967","worksFor":{"@type":"Organization","address":"Piispanportti 11, Espoo","name":"Bo LKV | Espoo","logo":"https://cdn.asunnot.oikotie.fi/9CkdDRX0zrwp09odStbQAGL1Y34=/fit-in/300x260/ot-real-estate-mediabank-prod/513/195/source/214591315","url":"http://www.bo.fi/","telephone":"0408086832"}}},"brand":{"@type":"Organization","address":"Piispanportti 11, Espoo","name":"Bo LKV | Espoo","logo":"https://cdn.asunnot.oikotie.fi/9CkdDRX0zrwp09odStbQAGL1Y34=/fit-in/300x260/ot-real-estate-mediabank-prod/513/195/source/214591315","url":"http://www.bo.fi/","telephone":"0408086832"}} +</script> <meta property="place:location:latitude" content="60.167446053319"> + <meta property="place:location:longitude" content="25.05309710345"> +<script type="application/ld+json">{"@context":"http://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://asunnot.oikotie.fi/myytavat-asunnot","url":"https://asunnot.oikotie.fi/myytavat-asunnot","name":"Myytävät asunnot"}},{"@type":"ListItem","position":2,"item":{"@id":"https://asunnot.oikotie.fi/myytavat-asunnot/helsinki","url":"https://asunnot.oikotie.fi/myytavat-asunnot/helsinki","name":"Helsinki"}},{"@type":"ListItem","position":3,"item":{"@id":"https://asunnot.oikotie.fi/myytavat-asunnot/helsinki/laajasalo","url":"https://asunnot.oikotie.fi/myytavat-asunnot/helsinki/laajasalo","name":"Laajasalo"}},{"@type":"ListItem","position":4,"item":{"@id":"https://asunnot.oikotie.fi/myytavat-asunnot/helsinki/23911499","url":"https://asunnot.oikotie.fi/myytavat-asunnot/helsinki/23911499","name":"Sarvastonkaari 3 G, 00840 Helsinki"}}]} +</script><script type="application/ld+json">{"@context":"http://schema.org","@type":"WebSite","name":"Oikotie Asunnot","url":"https://asunnot.oikotie.fi"} +</script><script type="application/ld+json">{"@context":"http://schema.org","@type":"Organization","name":"Oikotie Asunnot","url":"https://asunnot.oikotie.fi","logo":"https://cdn.asunnot.oikotie.fi/images/oikotie-neg.png","sameAs":["https://fi-fi.facebook.com/oikotieasunnot","https://x.com/OikotieAsunnot","https://www.youtube.com/oikotieasunnot"],"contactPoint":[{"@type":"ContactPoint","url":"https://tuki.oikotie.fi","contactType":"customer service","availableLanguage":"Finnish"}]} +</script><meta name="Calculator" content="nordeav2"><!-- Favicon tags --> +<link rel="apple-touch-icon" sizes="57x57" href="https://cdn.asunnot.oikotie.fi/images/favicon/apple-icon-57x57.png?ver=20180406"> +<link rel="apple-touch-icon" sizes="60x60" href="https://cdn.asunnot.oikotie.fi/images/favicon/apple-icon-60x60.png?ver=20180406"> +<link rel="apple-touch-icon" sizes="72x72" href="https://cdn.asunnot.oikotie.fi/images/favicon/apple-icon-72x72.png?ver=20180406"> +<link rel="apple-touch-icon" sizes="76x76" href="https://cdn.asunnot.oikotie.fi/images/favicon/apple-icon-76x76.png?ver=20180406"> +<link rel="apple-touch-icon" sizes="114x114" href="https://cdn.asunnot.oikotie.fi/images/favicon/apple-icon-114x114.png?ver=20180406"> +<link rel="apple-touch-icon" sizes="120x120" href="https://cdn.asunnot.oikotie.fi/images/favicon/apple-icon-120x120.png?ver=20180406"> +<link rel="apple-touch-icon" sizes="144x144" href="https://cdn.asunnot.oikotie.fi/images/favicon/apple-icon-144x144.png?ver=20180406"> +<link rel="apple-touch-icon" sizes="152x152" href="https://cdn.asunnot.oikotie.fi/images/favicon/apple-icon-152x152.png?ver=20180406"> +<link rel="apple-touch-icon" sizes="180x180" href="https://cdn.asunnot.oikotie.fi/images/favicon/apple-icon-180x180.png?ver=20180406"> +<link rel="icon" type="image/png" sizes="192x192" href="https://cdn.asunnot.oikotie.fi/images/favicon/android-icon-192x192.png?ver=20180406"> +<link rel="icon" type="image/png" sizes="32x32" href="https://cdn.asunnot.oikotie.fi/images/favicon/favicon-32x32.png?ver=20180406"> +<link rel="icon" type="image/png" sizes="96x96" href="https://cdn.asunnot.oikotie.fi/images/favicon/favicon-96x96.png?ver=20180406"> +<link rel="icon" type="image/png" sizes="16x16" href="https://cdn.asunnot.oikotie.fi/images/favicon/favicon-16x16.png?ver=20180406"> +<link rel="manifest" href="https://cdn.asunnot.oikotie.fi/images/favicon/manifest.json?ver=20180406"> +<meta name="msapplication-TileColor" content="#FFFFFF"> +<meta name="msapplication-TileImage" content="https://cdn.asunnot.oikotie.fi/images/favicon/ms-icon-144x144.png?ver=20180406"> +<meta name="theme-color" content="#FFFFFF"> +<meta name="format-detection" content="telephone=no"> +<meta http-equiv="Accept-CH" content="sec-ch-ua-model,sec-ch-ua-platform-version" /> +<meta http-equiv="Permissions-Policy" content="ch-ua-model=*,ch-ua-platform-version=*" /> +<meta name="api-token" content="228caac1612a3472ffb9e6ec48c4374392a1e18ef744f3dbefa1a6a24e8bcd51"> +<meta name="loaded" content="1763109425"> +<meta name="cuid" content="31f8ef89d72919a93370c6e2c8e3aef09ee5a301"> +<script> + var otAsunnot={"loginData":{"widgetSrcUrl":"https://static.oikotiecdn.fi/schibsted-account/ot-session-widget.min.js","clientId":"6322eb3b9dddad507226afac","target":"ot-apts","userKey":null,"loginError":null,"deniedUrl":null,"adminLogin":false},"notificationCenter":{"src":"https://static.oikotiecdn.fi/notificationsclient/ns.bundle.js","options":{"target":"ot-apts","vertical":"otas"}},"applicationRedirectUrl":null,"translations":{"fi":{"listing/contact/modal/message":"Olen kiinnostunut kohteestanne osoitteessa {{address}}."}},"company":{"name":"Bo LKV | Espoo","streetAddress":"Piispanportti 11","zipCode":"02240","city":"Espoo","url":"https://asunnot.oikotie.fi/yritys/bo-lkv-oy/bo-lkv-espoo-14641782","email":null,"satellites":[]},"companyLogo":"https://cdn.asunnot.oikotie.fi/9CkdDRX0zrwp09odStbQAGL1Y34=/fit-in/300x260/ot-real-estate-mediabank-prod/513/195/source/214591315","hasInsuranceCalculator":false,"bankCalculator":"nordeav2","showContactForm":true,"sellStatus":3,"isPopular":false,"cardId":"23911499","cardType":100,"analytics":{"cardId":23911499,"apartmentType":"Paritalo","apartmentTypeId":64,"realtorListingNumber":"21055475","status":1,"size":78.5,"price":305000,"published":"2025-11-14 08:30:48","vertical":"Myytavat","subVertical":"Asunnot","privateListing":0,"brokerName":"Pia Lundenberg","realtorCompany":"Bo LKV | Espoo","realtorCompanyId":14641782,"realtorCompanyPackage":3,"realtorCorporation":"Bo LKV Oy","realtorCorporationId":14739921,"zipCode":"00840","locationPath":"Helsinki/Laajasalo, Hevossalmi, Laajasalo, Itä-Helsinki, Kaakkoinen, Itäinen/00840","habitationType":1,"apartmentBuildYear":1978,"listingType":1},"tori":{"tags":["Helsinki","274 000 € - 336 000 €","63 m² - 94 m²"],"url":"/myytavat-asunnot?cardType=100&locations%5B0%5D%5B0%5D=64&locations%5B0%5D%5B1%5D=6&locations%5B0%5D%5B2%5D=Helsinki&price%5Bmin%5D=274000&price%5Bmax%5D=336000&size%5Bmin%5D=63&size%5Bmax%5D=94"},"habitationType":1,"activeViewings":[],"showContact":true,"address":"Sarvastonkaari 3 G, 00840 Helsinki","contact":{"contactModel":{"contactEmail":null,"contactEmail2":null,"contactEmail3":null,"contactAddress":null,"contactName":"Pia Lundenberg","contactPersonPictureUrl":"https://cdn.asunnot.oikotie.fi/bDQ9y4IaKxoFFd2x6Q7cbficors=/360x360/smart/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/977/910/source/223019779","contactPhone":"040 522 1967","contactShow":1,"contactPersonTitle":"myyntipäällikkö, asuntomyyjä, KED, partner ","contactPersonDegrees":null,"contactPersonSomeUrl":null,"contactPersonSome":null,"realEstateAgentEmail":"pia.lundenberg@bo.fi","contactFormHiddenOverride":null},"contactPersonImage":"https://cdn.asunnot.oikotie.fi/bDQ9y4IaKxoFFd2x6Q7cbficors=/360x360/smart/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/977/910/source/223019779","contactIsVisible":true,"contactUrl":"https://asunnot.oikotie.fi/yritys/bo-lkv-espoo/pia-lundenberg-23330305"},"poisOnMapVisible":true,"finnishLandlordAssociationVoucherMedia":null,"showSkvlLogo":false,"districtId":1687,"bannerParams":{"target_id":"21055475","realtor_name":"Pia Lundenberg","realtor_image":"https://cdn.asunnot.oikotie.fi/bDQ9y4IaKxoFFd2x6Q7cbficors=/360x360/smart/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/977/910/source/223019779","price":305000,"size":78.5,"image":"https://cdn.asunnot.oikotie.fi/0HZhne5PHBdhl0BxcAx-7RkB0Mo=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/018/901/source/225109810","district":"Laajasalo","area":"Helsinki"}};window.page='listing';window.IS_BUSINESS=false;window.VC_REVISION='4138';window.SSO_TARGET='ot-apts';window.SSO_API_URL='https://sso.oikotie.fi';window.SSO_OIKOTIE_URL='https://oikotie.fi';window.MAP_URL='https://map.asunnot.oikotie.fi/v1';window.URL_STATIC_CDN='https://cdn.asunnot.oikotie.fi';window.dataLayer=[];window.features=["recommendations","spankki","danske","product","op","asunnot_recommendations","if_kotivakuutuslaskuri","denyApiKeyless","import_aging_cards","cards_to_marketo","vuokraturva","living-area","living-area-links","mobile-map","apple_login","notification_center","customCalculatorReports","send_extravisibility_report","oikotie_cmp","OP identification","disable-credit-extra-visibility","sell-page-floor-plan-card","funnel-media-floor-plan-card","private-rental-tori-visibility","searchCSAT","asuntoliiga","contactCSAT","searchMapCSAT","neighbourhood-profile","neighbourhood-profile-csat","nordeaV2Calculator","qasa-card","displayAds_GooglePublisherTag","broadband-promotion-valokuitunen","loisto","semantic_search","if_kotivakuutuslaskuri_sales"];window.isEmbedded=false;</script> + <meta name="ot-cmp-property-id" content="35383"> + <meta name="ot-cmp-property-href" content="oikotie.fi"> + <script src="https://static.oikotiecdn.fi/cmp/cmp.bundle.js"></script> +<!-- Google Tag Manager --> +<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-PDLK3K" + height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> +<script> + (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push( + {'gtm.start': new Date().getTime(),event:'gtm.js'} + );var f=d.getElementsByTagName(s)[0], + j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true; + j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl; + f.parentNode.insertBefore(j,f); + })(window,document,'script','dataLayer','GTM-PDLK3K'); +</script> +<!-- End Google Tag Manager --> +<script> + var r = document.documentElement; + r.classList.remove('no-js'); + r.classList.add('js'); +</script> + <link rel="stylesheet" href="https://cdn.asunnot.oikotie.fi/css/ot-asunnot/root.a3a581da.css"> + <link rel="stylesheet" href="https://cdn.asunnot.oikotie.fi/css/ot-asunnot/common.74c2d850.css"> + <link rel="stylesheet" media="print" + href="https://cdn.asunnot.oikotie.fi/css/ot-asunnot/print.8fd4faf2.css"> + + <link rel="stylesheet" + href="https://cdn.asunnot.oikotie.fi/css/ot-asunnot/listing-page.2e65745f.css"> +<style> + .customer-color{background:#f6e3e4!important;color:#000000!important;}.customer-color-for-bg{color:#000000!important;}.customer-color-text{color:#707070;}.customer-color-text svg{fill:#707070;}.customer-color-link{color:#707070;}.customer-color-link:hover,.customer-color-link:focus{color:#707070 !important;}.customer-color-link .link__text--underline{text-decoration-color:#707070;}.customer-color-link .link__icon{color:#707070;fill:#707070;}.button--customer-color{background:#f6e3e4!important;border-color:#f6e3e4!important;color:#000000!important;}.button--customer-color:hover{opacity:.8}.button--secondary--customer-color{background-color:#FFF!important;color:#707070!important;border-color:#707070!important}.button--secondary--customer-color .button__icon{color:#707070!important}.button--secondary--customer-color:focus{opacity:.8}.customer-color-border{border-color:#DDDDDD!important}.customer-color-border-hover:hover,.customer-color-border-hover:focus,.customer-color-border-hover:active{border-color:#DDDDDD!important;outline:0}.customer-color-link .favourite__icon--favourited{color:#707070;animation:favourite .2s}.customer-color-link .favourite__icon--favourited:hover,.customer-color-link .favourited__icon--favourited:focus{color:#707070}.customer-color-link .favourite__icon--unfavourited{color:#707070}.customer-color-link .favourite__icon--favourited:hover,.customer-color-link .favourited__icon--favourited:focus{color:#707070;}</style> + <script type="module" src="/angular/js/runtime.ff601bd9184ff030.js"></script><script type="module" src="/angular/js/polyfills.5a78d7906d3289dc.js"></script><script type="module" src="/angular/js/vendor.e2b1332909e5051b.js"></script><script type="module" src="/angular/js/main.02c5b40a58c6c0fd.js"></script></head> +<body class="listing-page"> +<a href="https://23t8exwo1b.execute-api.eu-west-1.amazonaws.com/ProdStage" rel="nofollow" style="display: none" aria-hidden="true">Most visited</a> +<script> + window.otAsunnot.googleTagConfig = {"networkId":117157013,"isCompanyProduct":true,"keywords":{"publisher":"fi-oikotie_real_estate","oikotie_lvl_1":"asunnot","oikotie_lvl_2":"myytavat","oikotie_type":"myytavat","oikotie_page_type":"object","oikotie_store_tag":["bolkv"],"oikotie_product_type":"yrityskohde","oikotie_area":"helsinki","oikotie_district":"helsinki_laajasalo","oikotie_card_id":23911499,"oikotie_vendor_ad_id":"21055475","oikotie_broker_id":23330305},"targetIds":["banner_right","banner_bottom"],"pageType":"object","subSection":"company","featureFlag":"displayAds_GooglePublisherTag"}; +</script> + <script> + window.googletag = window.googletag || {cmd: []}; + </script> + <script src="https://securepubads.g.doubleclick.net/tag/js/gpt.js" onload="window.otAsunnot.googleTagError = false" crossorigin="anonymous" onerror="document.body.classList.remove('fixed-top-banner')"></script> + +<div id="fb-root"></div> +<div class="wallpaper-container" ></div> +<main class="layout"> + <header class="header" sticky-header navigation + ng-class="{'header--navigation-open': nav.isMobileMenuOpen}"> + <div class="header__wrapper"> + <div class="header__section"> + <a target="_self" href="/" analytics-click="header_logo" class="link link--muted header__link"> + <img class="header__logo" + loading="eager" + src="https://cdn.asunnot.oikotie.fi/images/oikotie-logo-black.svg" + alt="Oikotie"> + </a> + <nav class="navigation" itemscope + itemtype="https://schema.org/SiteNavigationElement"> + <div class="navigation__desktop"> + <ul class="navigation__item-container" + ng-class="{'navigation__item-container--hidden': nav.isMobileMenuOpen}"> + <li class="navigation__item"> + <a itemprop="url" href="/" + analytics-click="main-navigation_click_desktop-link" + analytics-click-meta="Etusivu" + class="link link--muted navigation__link" + target="_self"><span itemprop="name">Etusivu</span></a> + </li> + <li class="navigation__item"> + <a itemprop="url" href="/myytavat-asunnot" + analytics-click="main-navigation_click_desktop-link" + analytics-click-meta="Myytävät" + class="link link--muted navigation__link navigation__link--active" + target="_self"><span itemprop="name">Myytävät</span></a> + </li> + <li class="navigation__item"> + <a itemprop="url" href="/vuokra-asunnot" + analytics-click="main-navigation_click_desktop-link" + analytics-click-meta="Vuokrattavat" + class="link link--muted navigation__link" + target="_self"><span itemprop="name">Vuokrattavat</span></a> + </li> + <li class="navigation__item"> + <a itemprop="url" href="/ostetaan" + analytics-click="main-navigation_click_desktop-link" + analytics-click-meta="Ostetaan" + class="link link--muted navigation__link" + target="_self"><span itemprop="name">Ostetaan</span></a> + </li> + <li class="navigation__item"> + <a itemprop="url" href="/valitse-kiinteistonvalittaja" + analytics-click="main-navigation_click_desktop-link" + analytics-click-meta="Löydä välittäjä" + class="link link--muted navigation__link" + target="_self"><span itemprop="name">Löydä välittäjä</span></a> + </li> + <li class="navigation__item"> + <a itemprop="url" href="/myy" + analytics-click="main-navigation_click_desktop-link" + analytics-click-meta="Myy itse" + class="link link--muted navigation__link" + target="_self"><span itemprop="name">Myy itse</span></a> + </li> + <li class="navigation__item"> + <a itemprop="url" href="/vuokraa" + analytics-click="main-navigation_click_desktop-link" + analytics-click-meta="Vuokranantajalle" + class="link link--muted navigation__link" + target="_self"><span itemprop="name">Vuokranantajalle</span></a> + </li> + <li class="navigation__item"> + <a itemprop="url" href="/artikkelit/" + analytics-click="main-navigation_click_desktop-link" + analytics-click-meta="Ideat & oppaat" + class="link link--muted navigation__link" + target="_self"><span itemprop="name">Ideat & oppaat</span></a> + </li> + <li class="navigation__item"> + <a class="button button--text navigation__button" href="https://toimitilat.oikotie.fi" target="_blank" + analytics-click="main-navigation_click_mobile-link" + analytics-click-meta="Toimitilat"> + <span class="button__text">Toimitilat</span><i class="icon icon--external button__icon" aria-hidden="true"></i> + </a> + </li> + </ul> + </div> + <div class="navigation__mobile navigation__mobile--hidden" + ng-class="{'navigation__mobile--hidden': !nav.isMobileMenuOpen}"> + <ul class="navigation__mobile-link-container" navigation-mobile-accordion-group> + <li class="navigation__item navigation__item--mobile" + > + <a itemprop="url" + href="/" + target="_self" + class="link link--muted navigation__mobile-link" + analytics-click="main-navigation_click_mobile-link" + analytics-click-meta="Etusivu">Etusivu</a> + </li> + <li class="navigation__item navigation__item--mobile" + ng-class="{'navigation__mobile-link--accordion-open': mobileAccordion.isOpen}" navigation-mobile-accordion> + <button ng-click="mobileAccordion.toggle()" class="button button--no-styling button--fill"> + <span + class="navigation__mobile-link navigation__mobile-link--accordion navigation__mobile-link--active" + ng-class="{'navigation__mobile-link--open': mobileAccordion.isOpen}"> + <span>Myytävät</span> + <span ng-if="!mobileAccordion.isOpen" + aria-hidden="true" + class="link link--muted navigation__accordion-icon navigation__accordion-icon--hidden"> + <i class="link__icon icon icon--chevron-down"></i> + </span> + <span ng-if="mobileAccordion.isOpen" + aria-hidden="true" + class="link link--muted navigation__accordion-icon"> + <i class="link__icon icon icon--chevron-up"></i> + </span> + </span> + </button> + <div class="navigation__accordion-content" + ng-class="{'navigation__accordion-content--open': mobileAccordion.isOpen}"> + <ul class="navigation__mobile-link-container"> + <li class="navigation__item navigation__item--sub-menu"> + <a class="link link--muted navigation__mobile-link navigation__mobile-link--sub-menu navigation__mobile-link--sub-menu-active" + href="/myytavat-asunnot" + target="_self" + analytics-click="main-navigation_click_mobile-link" + analytics-click-meta="Asunnot">Asunnot</a> + </li> + <li class="navigation__item navigation__item--sub-menu"> + <a class="link link--muted navigation__mobile-link navigation__mobile-link--sub-menu" + href="/myytavat-uudisasunnot" + target="_self" + analytics-click="main-navigation_click_mobile-link" + analytics-click-meta="Uudisasunnot">Uudisasunnot</a> + </li> + <li class="navigation__item navigation__item--sub-menu"> + <a class="link link--muted navigation__mobile-link navigation__mobile-link--sub-menu" + href="/myytavat-loma-asunnot" + target="_self" + analytics-click="main-navigation_click_mobile-link" + analytics-click-meta="Loma-asunnot">Loma-asunnot</a> + </li> + <li class="navigation__item navigation__item--sub-menu"> + <a class="link link--muted navigation__mobile-link navigation__mobile-link--sub-menu" + href="/myytavat-autotallit" + target="_self" + analytics-click="main-navigation_click_mobile-link" + analytics-click-meta="Autotallit">Autotallit</a> + </li> + <li class="navigation__item navigation__item--sub-menu"> + <a class="link link--muted navigation__mobile-link navigation__mobile-link--sub-menu" + href="/myytavat-tontit" + target="_self" + analytics-click="main-navigation_click_mobile-link" + analytics-click-meta="Tontit">Tontit</a> + </li> + <li class="navigation__item navigation__item--sub-menu"> + <a class="link link--muted navigation__mobile-link navigation__mobile-link--sub-menu" + href="/myytavat-metsatilat-ja-maatilat" + target="_self" + analytics-click="main-navigation_click_mobile-link" + analytics-click-meta="Maa- ja metsätilat">Maa- ja metsätilat</a> + </li> + </ul> + </div> + </li> + <li class="navigation__item navigation__item--mobile" + ng-class="{'navigation__mobile-link--accordion-open': mobileAccordion.isOpen}" navigation-mobile-accordion> + <button ng-click="mobileAccordion.toggle()" class="button button--no-styling button--fill"> + <span + class="navigation__mobile-link navigation__mobile-link--accordion " + ng-class="{'navigation__mobile-link--open': mobileAccordion.isOpen}"> + <span>Vuokrattavat</span> + <span ng-if="!mobileAccordion.isOpen" + aria-hidden="true" + class="link link--muted navigation__accordion-icon navigation__accordion-icon--hidden"> + <i class="link__icon icon icon--chevron-down"></i> + </span> + <span ng-if="mobileAccordion.isOpen" + aria-hidden="true" + class="link link--muted navigation__accordion-icon"> + <i class="link__icon icon icon--chevron-up"></i> + </span> + </span> + </button> + <div class="navigation__accordion-content" + ng-class="{'navigation__accordion-content--open': mobileAccordion.isOpen}"> + <ul class="navigation__mobile-link-container"> + <li class="navigation__item navigation__item--sub-menu"> + <a class="link link--muted navigation__mobile-link navigation__mobile-link--sub-menu" + href="/vuokra-asunnot" + target="_self" + analytics-click="main-navigation_click_mobile-link" + analytics-click-meta="Asunnot">Asunnot</a> + </li> + <li class="navigation__item navigation__item--sub-menu"> + <a class="link link--muted navigation__mobile-link navigation__mobile-link--sub-menu" + href="/vuokrattavat-loma-asunnot" + target="_self" + analytics-click="main-navigation_click_mobile-link" + analytics-click-meta="Loma-asunnot">Loma-asunnot</a> + </li> + <li class="navigation__item navigation__item--sub-menu"> + <a class="link link--muted navigation__mobile-link navigation__mobile-link--sub-menu" + href="/vuokrattavat-autotallit" + target="_self" + analytics-click="main-navigation_click_mobile-link" + analytics-click-meta="Autotallit">Autotallit</a> + </li> + </ul> + </div> + </li> + <li class="navigation__item navigation__item--mobile" + > + <a itemprop="url" + href="/ostetaan" + target="_self" + class="link link--muted navigation__mobile-link" + analytics-click="main-navigation_click_mobile-link" + analytics-click-meta="Ostetaan">Ostetaan</a> + </li> + <li class="navigation__item navigation__item--mobile" + > + <a itemprop="url" + href="/valitse-kiinteistonvalittaja" + target="_self" + class="link link--muted navigation__mobile-link" + analytics-click="main-navigation_click_mobile-link" + analytics-click-meta="Löydä välittäjä">Löydä välittäjä</a> + </li> + <li class="navigation__item navigation__item--mobile" + > + <a itemprop="url" + href="/myy" + target="_self" + class="link link--muted navigation__mobile-link" + analytics-click="main-navigation_click_mobile-link" + analytics-click-meta="Myy itse">Myy itse</a> + </li> + <li class="navigation__item navigation__item--mobile" + > + <a itemprop="url" + href="/vuokraa" + target="_self" + class="link link--muted navigation__mobile-link" + analytics-click="main-navigation_click_mobile-link" + analytics-click-meta="Vuokranantajalle">Vuokranantajalle</a> + </li> + <li class="navigation__item navigation__item--mobile" + > + <a itemprop="url" + href="/artikkelit/" + target="_self" + class="link link--muted navigation__mobile-link" + analytics-click="main-navigation_click_mobile-link" + analytics-click-meta="Ideat & oppaat">Ideat & oppaat</a> + </li> + <li class="navigation__item navigation__item--mobile"> + <a itemprop="url" href="https://toimitilat.oikotie.fi" + analytics-click="main-navigation_click_mobile-link" + analytics-click-meta="Toimitilat" + class="link link--muted navigation__mobile-link navigation__mobile-link--external" + target="_blank"> + <span itemprop="name" class="link__text">Toimitilat</span> + <i class="link__icon icon icon--external icon--primary margined margined--v20" + aria-hidden="true"></i> + </a> + </li> + </ul> + </div> +</nav> + </div> + <div class="header__section header__section--controls"> + <div class="header__link header__link--notification-center"> + <notification-center></notification-center> + </div> + <login-v2 class="header__link header__link--login"></login-v2> + <div class="header__link header__link--mobile"> + <button class="button button--icon" ng-if="!nav.isMobileMenuOpen" aria-label="Näytä valikko" + ng-click="nav.openMobileMenu()"> + <i aria-hidden="true" class="icon-highlight icon-highlight--inverted icon icon--small icon--menu"></i> + </button> + <button class="button button--icon ng-cloak" ng-if="nav.isMobileMenuOpen" aria-label="Piilota valikko" + ng-click="nav.closeMobileMenu()"> + <i aria-hidden="true" class="icon-highlight icon-highlight--inverted icon icon--small icon--close"></i> + </button> + </div> + </div> + </div> +</header> +<div class="content padded--v0-hPage"> + <div class="content__section"> + <ad-unit target-id="banner_top" class="top-banner"></ad-unit> + </div> +</div> +<div class="content padded--v0-hPage content--primary-background center-on-wallpaper"> + <div class="content__section padded padded--v0-h0 padded--desktop-v20-h0 padded--bottomless"> + + <div class="breadcrumbs "> + <span class="breadcrumbs__item"><a target="_self" class="link" href="https://asunnot.oikotie.fi/myytavat-asunnot">Myytävät asunnot</a></span> + <span class="breadcrumbs__item"> <i class="icon icon--chevron-right breadcrumbs__icon" aria-hidden="true"></i> <a class="link" target="_self" href="https://asunnot.oikotie.fi/myytavat-asunnot/helsinki">Helsinki</a></span> + <span class="breadcrumbs__item"> <i class="icon icon--chevron-right breadcrumbs__icon" aria-hidden="true"></i> <a class="link" target="_self" href="https://asunnot.oikotie.fi/myytavat-asunnot/helsinki/laajasalo">Laajasalo</a></span> + <span class="breadcrumbs__item"> <i class="icon icon--chevron-right breadcrumbs__icon" aria-hidden="true"></i> Sarvastonkaari 3 G, 00840 Helsinki</span> + </div> + + + <div class="listing-navigation padded padded--v15-h0"> + <div class="listing-navigation__back"> + <back-to-results [card-id]="23911499" [card-type]="100" cta="Palaa hakutuloksiin"></back-to-results> + </div> + <div class="listing-navigation__results"> + <result-browse card-id="23911499"></result-browse> + </div> +</div> + + </div> +</div> + + + +<section class="sticky-side"> + <div class="sticky-side__scroll-track" aria-hidden="true"> + <div class="sticky-side__moving"> + <ad-unit target-id="banner_right"></ad-unit> + </div> + </div> + + <div class="content content--primary-background center-on-wallpaper"> + <div class="content__section"> + <div class="listing-header customer-color"> + <div class="listing-header__aside"> + <a href="http://www.bo.fi/" + target="_blank" rel="nofollow noopener"> + + <img alt="Yrityslogo" class="listing-header__company-logo" + src="https://cdn.asunnot.oikotie.fi/Rz5uXpgU5ikDXfk2s5Vjdl27208=/fit-in/250x60/ot-real-estate-mediabank-prod/513/195/source/214591315"> + + </a> </div> + <div + class="listing-header__details"> + <h2 class="heading heading--title-1 listing-header__headline listing-header__headline--primary customer-color"><span class="listing-header__text">305 000 €</span><span class="listing-header__divider" aria-hidden="true">●</span><span class="listing-header__text">78,5 m²</span></h2><h1 class="heading heading--no-styling listing-header__headline listing-header__headline--secondary customer-color margined margined--v15"><span class="listing-header__text">Sarvastonkaari 3 G, Laajasalo, Helsinki</span><span class="listing-header__divider" aria-hidden="true">●</span><span class="listing-header__text listing-header__text--cut-overflow">3h, avok. kph, s (yj. mukaan 3h+k+s)</span></h1> </div> +</div> + <div class="gallery-container"> + <div class="tabs-content"> + <div role="tabpanel" class="content active padded padded--v30-h15" id="gallery-tab"> + <div class="galleria" + galleria + data-image-placeholder="https://asunnot.oikotie.fi/lib/images/placeholder/building/large.jpg" + data-moreinfoUrl="" + data-card-id="23911499" + data-image-crop="landscape"> + <a href="https://cdn.asunnot.oikotie.fi/iyAPBsjSregyUC7ZSr7LuUaA-gg=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/018/901/source/225109810"> + <img src="https://cdn.asunnot.oikotie.fi/UpSLnWrQu9UvvWhAZ50rgQKYKtc=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/018/901/source/225109810" + data-big="https://cdn.asunnot.oikotie.fi/0HZhne5PHBdhl0BxcAx-7RkB0Mo=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/018/901/source/225109810" + data-title="1/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/7GqKt1Zx132RLqcbDExq7FU3z1E=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/138/901/source/225109831"> + <img src="https://cdn.asunnot.oikotie.fi/-uFX7D-yb0ARtz-ACCh5tJbEDow=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/138/901/source/225109831" + data-big="https://cdn.asunnot.oikotie.fi/KbxOgRYA2EEBf4b-miWyP9y1KY4=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/138/901/source/225109831" + data-title="2/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/h_ov2EFn37cQVTiTO5ES6xwKBBg=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/218/901/source/225109812"> + <img src="https://cdn.asunnot.oikotie.fi/Qdl80x4SPutAJ_FT-UDx6eUDLQc=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/218/901/source/225109812" + data-big="https://cdn.asunnot.oikotie.fi/yA5RP-Q_kpcIUwDWLeu6NvwrzkQ=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/218/901/source/225109812" + data-title="3/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/YSBKgd3XEBeXE9QqOCgLQnWmpBY=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/618/901/source/225109816"> + <img src="https://cdn.asunnot.oikotie.fi/-zIyM2x6ZaCuXpxcUq31xParma4=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/618/901/source/225109816" + data-big="https://cdn.asunnot.oikotie.fi/thARWQDi9c6SSNECU0HJJn89fD0=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/618/901/source/225109816" + data-title="4/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/cwX1xTlwHcwz7Z_J78kuejRjsJY=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/408/901/source/225109804"> + <img src="https://cdn.asunnot.oikotie.fi/asaktazsCzm0AB7Ur66CuS4nPHo=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/408/901/source/225109804" + data-big="https://cdn.asunnot.oikotie.fi/T7-Qxzdg5LGwuuXRz4jSOY1ky8s=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/408/901/source/225109804" + data-title="5/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/gX0G6svtWEP5QJZWz34pla0lYH0=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/028/901/source/225109820"> + <img src="https://cdn.asunnot.oikotie.fi/AweD-tzhgBwFNm9jiadtv7rbgG4=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/028/901/source/225109820" + data-big="https://cdn.asunnot.oikotie.fi/_u4BzRWMJDjQMdtGtgCs68Z3YVE=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/028/901/source/225109820" + data-title="6/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/I-VPrIwk2IuN_iY_5qJTLiB9TaY=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/228/901/source/225109822"> + <img src="https://cdn.asunnot.oikotie.fi/b9obW0ee7_VsQhT2dH8QQocQpdU=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/228/901/source/225109822" + data-big="https://cdn.asunnot.oikotie.fi/2HnROjod3LAdABiUH4ZICznkqUU=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/228/901/source/225109822" + data-title="7/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/Fva7gtC7dDtT2a8T7jHP2yF8lrc=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/518/901/source/225109815"> + <img src="https://cdn.asunnot.oikotie.fi/3alC_yatO5l_Sza4jmfAlvnpSJA=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/518/901/source/225109815" + data-big="https://cdn.asunnot.oikotie.fi/QzCbf2u4IhW95IVx_awHT0uUvWc=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/518/901/source/225109815" + data-title="8/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/gi2b2vhF0regpD4-3j4HcSzBF08=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/718/901/source/225109817"> + <img src="https://cdn.asunnot.oikotie.fi/vUPeMCA503nZ6a-8V5FS40fZcvc=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/718/901/source/225109817" + data-big="https://cdn.asunnot.oikotie.fi/8nJCNToEW4TKXKUaBev3xxE_8ws=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/718/901/source/225109817" + data-title="9/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/z7bueHx0Hew9OwMSEK_b7jaI7mc=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/918/901/source/225109819"> + <img src="https://cdn.asunnot.oikotie.fi/pwDQkcDK1-rnC3iZNUloNY9m-MU=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/918/901/source/225109819" + data-big="https://cdn.asunnot.oikotie.fi/Z2DewUUQjlh-t0C6ZgvxEHqIkUQ=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/918/901/source/225109819" + data-title="10/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/_e7TOuz-5lbcxUyquZgfTsFMvvo=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/608/901/source/225109806"> + <img src="https://cdn.asunnot.oikotie.fi/fpjS6ZkuJlRjn-icELro4zxZShA=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/608/901/source/225109806" + data-big="https://cdn.asunnot.oikotie.fi/Nxk8fJ-2ZfSmfJ98OxrK_C4N1gU=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/608/901/source/225109806" + data-title="11/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/g4v8bHZhZat1Qi2inzDn1xYVB0E=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/118/901/source/225109811"> + <img src="https://cdn.asunnot.oikotie.fi/BlEvTgEd_x8hBK_9Sct53Qrh86M=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/118/901/source/225109811" + data-big="https://cdn.asunnot.oikotie.fi/jKg3Jne7g_ZnSd8g0YtGgpwBvtU=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/118/901/source/225109811" + data-title="12/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/M0WNM94NSGEx-qopaT011mnt0Ow=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/738/901/source/225109837"> + <img src="https://cdn.asunnot.oikotie.fi/PlYKTZHFbnQPbniJKhiR1ZT6Ns0=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/738/901/source/225109837" + data-big="https://cdn.asunnot.oikotie.fi/hbPljMfvuI7Y1EQHZF8WX2rh500=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/738/901/source/225109837" + data-title="13/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/-ERlkU1LMIDZsnceeGClzxiH1Rs=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/308/901/source/225109803"> + <img src="https://cdn.asunnot.oikotie.fi/a7gQyB7z54H1yVSMfQSaFEoZLdc=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/308/901/source/225109803" + data-big="https://cdn.asunnot.oikotie.fi/ThLQ01DtcY6maCoSy6JSAseFqA4=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/308/901/source/225109803" + data-title="14/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/pAWU6NpxQZDSBfEzp5tZcyCJ-74=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/818/901/source/225109818"> + <img src="https://cdn.asunnot.oikotie.fi/Px9Mllej8s4q5XwQVx2TqEfqQw8=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/818/901/source/225109818" + data-big="https://cdn.asunnot.oikotie.fi/UT411A3tFcrLlD3Vv420SzElh7U=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/818/901/source/225109818" + data-title="15/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/3zMjcdU5YexShcwrpUUeaGYvZ6s=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/318/901/source/225109813"> + <img src="https://cdn.asunnot.oikotie.fi/gIhtohN0V5BUfXxixD7sh09ea6Q=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/318/901/source/225109813" + data-big="https://cdn.asunnot.oikotie.fi/tL-aaRKDnKZNV9RSIf_DOTGRtgk=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/318/901/source/225109813" + data-title="16/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/jVRb6syY9Y2kDvFEfvSZ5YzQyl0=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/508/901/source/225109805"> + <img src="https://cdn.asunnot.oikotie.fi/xUHs_zrtPDjTsuqOhvu_y45NMbA=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/508/901/source/225109805" + data-big="https://cdn.asunnot.oikotie.fi/qUmfJ0rDH14z-n2ZmC-fGI799NI=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/508/901/source/225109805" + data-title="17/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/tHcuwJBVPLvoy9jKp2Hb7RfXf_E=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/908/901/source/225109809"> + <img src="https://cdn.asunnot.oikotie.fi/LY6RdDW_P8y_Zxr92qpSTnbh_0M=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/908/901/source/225109809" + data-big="https://cdn.asunnot.oikotie.fi/E7-2mDGpDeuUrXq1Kf3MmQVaGJU=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/908/901/source/225109809" + data-title="18/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/LVMzTupjVGZgfjsH3IpipnNmcAA=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/808/901/source/225109808"> + <img src="https://cdn.asunnot.oikotie.fi/QRUecClMw_GLjzKPs4CS66hQbcI=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/808/901/source/225109808" + data-big="https://cdn.asunnot.oikotie.fi/XobQpkLxpOZ9ISaNq0TyC3gYUOA=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/808/901/source/225109808" + data-title="19/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/rX_mWGj9QP9g8B0g_QsAb11qSLM=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/128/901/source/225109821"> + <img src="https://cdn.asunnot.oikotie.fi/ihDaXuwpDhsgAP0CddJ4Lev3uzA=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/128/901/source/225109821" + data-big="https://cdn.asunnot.oikotie.fi/Ttupz0zy6xVk7mdCJRWZtGXN9HI=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/128/901/source/225109821" + data-title="20/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/PLscEO7e3Ia1gS8wFY6iZ0amGlY=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/418/901/source/225109814"> + <img src="https://cdn.asunnot.oikotie.fi/T693qMoiW7NetyFc6yGaRRj2aB8=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/418/901/source/225109814" + data-big="https://cdn.asunnot.oikotie.fi/73RFpyQ_9RjM_AfTPCI9Eqy9diw=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/418/901/source/225109814" + data-title="21/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/XZJqZOl_tDhBZYu00NimTyk9yyY=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/708/901/source/225109807"> + <img src="https://cdn.asunnot.oikotie.fi/XME7ts1o89ZXd2G-aRoPmazsGgo=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/708/901/source/225109807" + data-big="https://cdn.asunnot.oikotie.fi/pZL-y_jWqYL5YAZrCDYBV_Ajk7I=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/708/901/source/225109807" + data-title="22/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/O_nxrfnEFOXDcXP7LWFDLuopqgM=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/538/901/source/225109835"> + <img src="https://cdn.asunnot.oikotie.fi/aXYcYzs9aAdSA8JE8exlU5oRX3c=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/538/901/source/225109835" + data-big="https://cdn.asunnot.oikotie.fi/khWZ8Nxl4yNi-GPzUI3nUv31RO4=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/538/901/source/225109835" + data-title="23/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/xy5ZWIjtE-fdX1RiDD4EXzgm8XI=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/328/901/source/225109823"> + <img src="https://cdn.asunnot.oikotie.fi/UR5Pe2g_dJD0uvV4YzNYWDCUn3A=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/328/901/source/225109823" + data-big="https://cdn.asunnot.oikotie.fi/KkeGYkYmVXUOK8xQdRXGDiqx2WE=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/328/901/source/225109823" + data-title="24/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/5B6hUeOr93PDB9BZ_cZlA8o0kkk=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/528/901/source/225109825"> + <img src="https://cdn.asunnot.oikotie.fi/2467MT1QlME-51zOL5M-xmlhYA0=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/528/901/source/225109825" + data-big="https://cdn.asunnot.oikotie.fi/0qmQrNQazKMguzmEjUn5ZdMYgn8=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/528/901/source/225109825" + data-title="25/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/8im9iq5t3KfZ-c2l-1cijABON8E=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/238/901/source/225109832"> + <img src="https://cdn.asunnot.oikotie.fi/MIajzDYUA8rul_Z4HqZg5aA3jdc=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/238/901/source/225109832" + data-big="https://cdn.asunnot.oikotie.fi/icAIiKNYomZu_1dMtSzhFxZq14w=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/238/901/source/225109832" + data-title="26/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/jWxB7oLyI9k1dHEiIumBg4s_7yk=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/428/901/source/225109824"> + <img src="https://cdn.asunnot.oikotie.fi/1fwCIw7Z6_Rv6_YhSaHSbDFV4qA=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/428/901/source/225109824" + data-big="https://cdn.asunnot.oikotie.fi/KVQzuSG_BfgaiTLJMllUTlx9SbY=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/428/901/source/225109824" + data-title="27/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/Y1pe9hU5CSkvGHFFC8Dk7PTqUns=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/728/901/source/225109827"> + <img src="https://cdn.asunnot.oikotie.fi/rD5QRIm19mmbkOPok9RPZB3wvvA=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/728/901/source/225109827" + data-big="https://cdn.asunnot.oikotie.fi/Go9opMllO1sL20qpuHAacQesD6o=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/728/901/source/225109827" + data-title="28/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/_Kc9OQb_vl1pjrMLPVe4bTl7AhM=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/438/901/source/225109834"> + <img src="https://cdn.asunnot.oikotie.fi/v-Udi8awEXX4neDksQrb9r5g4KI=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/438/901/source/225109834" + data-big="https://cdn.asunnot.oikotie.fi/4u2XM-NLvkD0F6WxCArV-8nEkwk=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/438/901/source/225109834" + data-title="29/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/jWdFqdGEKSGFSrH92WUmGWrw7_I=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/038/901/source/225109830"> + <img src="https://cdn.asunnot.oikotie.fi/_Itdh11eWCslMWlSRrneaEZgtts=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/038/901/source/225109830" + data-big="https://cdn.asunnot.oikotie.fi/Ko9aAdQKbcSNzUYj-k4bCyuQsaI=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/038/901/source/225109830" + data-title="30/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/Jlz1EzCjoB1e7IAqQvtf1JzIf_A=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/928/901/source/225109829"> + <img src="https://cdn.asunnot.oikotie.fi/a6QPQLZNXuCdx1058cvdU4RKUL0=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/928/901/source/225109829" + data-big="https://cdn.asunnot.oikotie.fi/cXWy1MljoSFVEXVogRDLh8CmQhU=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/928/901/source/225109829" + data-title="31/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/7S8pL13v4YxyWEurPz8Ox55oXfk=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/938/901/source/225109839"> + <img src="https://cdn.asunnot.oikotie.fi/mTtnpAmP9vkXWjG5YP4v-ERC_-4=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/938/901/source/225109839" + data-big="https://cdn.asunnot.oikotie.fi/QF2RivWTP3UqoJ71a8wAo_Pzu5g=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/938/901/source/225109839" + data-title="32/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/9aNaXweUVkwyZMLq8xF5KzCR6Vs=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/638/901/source/225109836"> + <img src="https://cdn.asunnot.oikotie.fi/2zLI82PiON237NW4B6X5-hgdons=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/638/901/source/225109836" + data-big="https://cdn.asunnot.oikotie.fi/OO8K4ML9l5p4TEz1wubRfMdxwI8=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/638/901/source/225109836" + data-title="33/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/xhQLWe37k9PDefQqNoBLDSlJ1Ok=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/628/901/source/225109826"> + <img src="https://cdn.asunnot.oikotie.fi/2ndjYjA1VjGTODO0oi1swmo04Eo=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/628/901/source/225109826" + data-big="https://cdn.asunnot.oikotie.fi/ByiZEu1jQ-TobZ1o4MbMIIs90Go=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/628/901/source/225109826" + data-title="34/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/-4BuDTK2uvxGKgSssWqoG6hh7ZU=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/828/901/source/225109828"> + <img src="https://cdn.asunnot.oikotie.fi/ikUIHd3RvdsJWSoed2XLr6RzJ90=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/828/901/source/225109828" + data-big="https://cdn.asunnot.oikotie.fi/U_dviF57DWHMbX3DlbkKjN-fyuw=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/828/901/source/225109828" + data-title="35/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/Q5CZeiUiB3zXT3SUoHfahGho0ts=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/838/901/source/225109838"> + <img src="https://cdn.asunnot.oikotie.fi/fM5sH8Z_uFf8lHCvMmYSnLzgd_I=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/838/901/source/225109838" + data-big="https://cdn.asunnot.oikotie.fi/rT2FLXjyPRHhRC5SM5mr8p0AwvY=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/838/901/source/225109838" + data-title="36/37" + alt=""></a> + <a href="https://cdn.asunnot.oikotie.fi/Mg0cNsRW4pvkA29CEyH8h3D1Pk0=/full-fit-in/980x653/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1):background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/338/901/source/225109833"> + <img src="https://cdn.asunnot.oikotie.fi/4G8x2rV-RWNf2qHU5ArqkIcGtdk=/215x161/filters:background_color(white):format(jpeg)/ot-real-estate-mediabank-prod/338/901/source/225109833" + data-big="https://cdn.asunnot.oikotie.fi/cr3bHmeqBuyHfYp-SNdwcbZyCD0=/filters:watermark(https://cdn.asunnot.oikotie.fi/FNgYc0cxRts1I9PguvqoW4Bqtrw=/static.asunnot.oikotie.fi/oikotie_watermark.png,0,-1,1)/ot-real-estate-mediabank-prod/338/901/source/225109833" + data-title="37/37" + alt=""></a> + </div> + <button type="button" class="open-galleria button button--secondary button--secondary--customer-color" + analytics-click="media_see-all-images">Katso kaikki kuvat</button> + </div> + <div role="tabpanel" class="content padded padded--v30-h15" id="map-tab"> + <div> + <listing-map-container + [card-type]="100" + [card-id]="23911499" + location-parameter="%5B%5B64%2C6%2C%22Helsinki%22%5D%5D" + [latitude]="60.16744605" + [longitude]="25.05309710"> + </listing-map-container> + </div> + </div> + <div foundation-tabs role="tablist"> + <ul class="gallery-controls" id="gallery-tabs" data-tab role="presentation"> + <li class="gallery-controls__item active"> + <a role="tab" aria-controls="gallery-tab" aria-selected="true" + analytics-click="listing_photos_click" + class="gallery-controls__link" + onclick="return false;" + href="#gallery-tab"> + <i class="gallery-controls__link-icon icon icon--image" aria-hidden="true"></i> + <span class="gallery-controls__link-text">Kuvat</span> + </a> + </li> + <li class="gallery-controls__item"> + <a role="tab" aria-controls="map-tab" aria-selected="false" + analytics-click="listing_map_click" + class="gallery-controls__link" + onclick="return false;" + href="#map-tab"> + <i class="gallery-controls__link-icon icon icon--map" aria-hidden="true"></i> + <span class="gallery-controls__link-text">Kartta</span> + </a> + </li> + + </ul> + </div> + <div class="gallery-mobile-extra-controls padded padded--v30-h0 padded--bottomless"> + <button class="open-galleria button button--secondary button--secondary--customer-color" + analytics-click="media_see-all-images">Katso kaikki kuvat</button> + </div> + </div> +</div> + </div> + </div> + + <tori-banner-container [show]="" key="tori-banner-listing-page-23911499"> + <tori-banner-listing-page></tori-banner-listing-page> + </tori-banner-container> + <div + class="content content--primary-background center-on-wallpaper padded padded--v10-hPage padded--desktop-v10-hPage padded--xdesktop-v10-h0 padded--topless"> + <div class="content__section"> + <div class="details-grid"> + <div class="details-grid__item"> + <div class="details-grid__item-icon" + aria-hidden="true"><svg height="30" viewBox="0 0 30 30" width="30" xmlns="http://www.w3.org/2000/svg"><path d="M30 15c0 8.284-6.716 15-15 15-8.284 0-15-6.716-15-15C0 6.716 6.716 0 15 0c8.284 0 15 6.716 15 15zm-1.304 0c0-7.564-6.132-13.696-13.696-13.696S1.304 7.436 1.304 15 7.436 28.696 15 28.696 28.696 22.564 28.696 15z"/><path d="M15 26.74C8.526 26.74 3.26 21.473 3.26 15S8.527 3.26 15 3.26 26.74 8.527 26.74 15 21.473 26.74 15 26.74zm0-1.305c5.753 0 10.435-4.682 10.435-10.435S20.753 4.565 15 4.565 4.565 9.247 4.565 15 9.247 25.435 15 25.435z"/><path d="M18.85 12.007c.257-.466.257-.466 0-.932a5.557 5.557 0 00-7.85 0 5.495 5.495 0 00-1.263 1.962h-.73c-.489.126-.489.126-.658.659.169.532.169.532.659.658h.41a5.58 5.58 0 000 1.292h-.41c-.49.126-.49.126-.66.658.17.533.17.533.66.66h.73a5.534 5.534 0 005.187 3.585c1.462 0 2.871-.572 3.925-1.625l-.02-.02c.288-.456.274-.479.02-.91-.466-.258-.466-.258-.932 0a4.24 4.24 0 01-5.986 0 4.19 4.19 0 01-.755-1.03h3.048c.49-.127.49-.127.659-.66-.17-.532-.17-.532-.659-.658h-3.477a4.275 4.275 0 010-1.292h3.477c.49-.126.49-.126.659-.658-.17-.533-.17-.533-.659-.659h-3.048c.195-.377.448-.724.755-1.03a4.239 4.239 0 015.986 0c.466.257.466.257.932 0zm-8.642 2.347l-.63-.824a5.561 5.561 0 00-.16.824zm.003 2.61l-.629-.48c.045.162.097.322.155.48zm.641-.827l-.628.826h.953a4.24 4.24 0 01-.325-.826zm-.104-.491h-.527l.629.48a4.263 4.263 0 01-.102-.48zm.102-1.772l-.63.48h.528c.024-.161.058-.321.102-.48zm-.626-.837l.628.826c.08-.287.188-.564.325-.826zm-.629.478l.058.18c-.08.25-.12.38-.195.462a5.57 5.57 0 00-.025.184h.778c.293 0 .55-.196.629-.479.077-.282.183-.554.315-.812h-.934a.652.652 0 00-.631.487.652.652 0 00.634.804h.513c.024-.157.057-.313.1-.467a.652.652 0 00-.63-.824h-.46a5.59 5.59 0 00-.152.465z"/></svg></div> + <div class="details-grid__item-text"> + <dl> + <dt class="details-grid__item-title">Velaton hinta</dt> + <dd class="details-grid__item-value">305 000 €</dd> + </dl> + <dl> + <dt class="details-grid__item-title">Hoitovastike</dt> + <dd class="details-grid__item-value">525,95 € / kk</dd> + </dl> + </div> + </div> + <div class="details-grid__item"> + <div class="details-grid__item-icon" + aria-hidden="true"><svg height="32" viewBox="0 0 30 32" width="30" xmlns="http://www.w3.org/2000/svg"><path d="M15.27.05l14.266 5.604.037.016a.728.728 0 01.427.662v19.336a.728.728 0 01-.464.678L15.27 31.949a.739.739 0 01-.54 0L.464 26.346A.729.729 0 010 25.668v-6.48c0-.403.329-.73.734-.73s.735.327.735.73v1.983l12.797-5.027V1.8l-1.483.583a.737.737 0 01-.953-.41.727.727 0 01.412-.945l2.496-.98.018-.004.01-.003-.015.003h-.002l.096-.027c.14-.03.289-.02.425.034zm13.261 23.265l-13.26 5.208a.74.74 0 01-.541 0L1.469 23.315v1.858L15 30.488l13.531-5.315zM15 17.423l-12.27 4.82L15 27.063l12.27-4.82zM15.734 1.8v14.344l2.66 1.045V9.374c0-.241.12-.467.321-.603a.74.74 0 01.684-.074l6.009 2.36c.28.11.464.378.464.677v8.392l2.66 1.045V6.827zm4.129 8.646v7.32l4.54 1.783v-7.32zM.734 11.504c.406 0 .735.326.735.729v3.084c0 .403-.33.729-.735.729S0 15.72 0 15.317v-3.084c0-.403.329-.729.734-.729zm2.75-6.252a.726.726 0 01-.323.903l-.09.043-1.602.629v1.968a.731.731 0 01-.735.73.733.733 0 01-.727-.63L0 8.794V6.331c0-.26.14-.5.364-.628l.1-.049 2.066-.811a.736.736 0 01.953.409zM9.84 2.755a.726.726 0 01-.322.903l-.09.042-2.763 1.086a.738.738 0 01-.953-.41.726.726 0 01.323-.903l.09-.042 2.762-1.085a.737.737 0 01.953.409zM14.75.044l-.008.003.004-.001z" fill-rule="evenodd" fill="#00A8EB"/></svg></div> + <div class="details-grid__item-text"> + <dl> + <dt class="details-grid__item-title">Asuinpinta-ala</dt> + <dd class="details-grid__item-value">78,5 m²</dd> + </dl> + <dl> + <dt class="details-grid__item-title">Huoneita</dt> + <dd class="details-grid__item-value">3</dd> + </dl> + </div> + </div> + <div class="details-grid__item"> + <div class="details-grid__item-icon" + aria-hidden="true"><svg height="31" viewBox="0 0 30 31" width="30" xmlns="http://www.w3.org/2000/svg"><path d="M14.65.101a.658.658 0 01.7 0l14.348 9.042a.642.642 0 010 1.09l-3.747 2.36 3.747 2.362c.372.234.4.748.086 1.026l-.086.064-3.748 2.361 3.748 2.362c.372.234.4.748.086 1.025l-.086.064L15.35 30.9a.658.658 0 01-.605.05l-.095-.05L.314 21.865a.646.646 0 01-.123-1.01l.059-.05.064-.045 3.734-2.354-3.734-2.354a.646.646 0 01-.123-1.009l.059-.051.064-.044 3.734-2.355L.314 10.24a.648.648 0 01-.064-.044l-.059-.052a.668.668 0 01-.131-.187.642.642 0 01.254-.822zm10.086 19.07l-7.307 4.605-2.079 1.31a.655.655 0 01-.195.083l-.103.016h-.104a.657.657 0 01-.203-.049l-.095-.05-9.386-5.914-3.397 2.14L15 29.59l13.133-8.277zM15 1.412L1.867 9.688 15 17.964l9.386-5.915.002-.002 3.745-2.36z" fill-rule="evenodd"/></svg></div> + <div class="details-grid__item-text"> + <dl> + <dt class="details-grid__item-title">Kerros</dt> + <dd class="details-grid__item-value">2 / 2</dd> + </dl> + </div> + </div> + <div class="details-grid__item"> + <div class="details-grid__item-icon" + aria-hidden="true"><svg height="27" viewBox="0 0 30 27" width="30" xmlns="http://www.w3.org/2000/svg"><path d="M3.798 27a.676.676 0 01-.67-.574l-.007-.1V16.071l-.153.14a1.242 1.242 0 01-1.603.054l-.105-.093-.899-.895a1.228 1.228 0 01-.074-1.658l.093-.1L14.143.344A1.24 1.24 0 0115.75.252l.107.092L19.364 3.7V2.688c0-.338.25-.618.577-.666l.1-.007h4.48c.34 0 .622.249.67.574l.008.1v6.598l4.421 4.232c.466.446.504 1.167.109 1.657l-.091.102-.899.895a1.242 1.242 0 01-1.6.125l-.108-.088-.152-.138v10.254c0 .339-.25.619-.577.667l-.1.007H12.2zM15 5.274L9.735 10.06l-5.26 4.783v10.81h7.047v-5.46c0-1.842 1.462-3.358 3.288-3.457l.19-.005c1.914 0 3.477 1.556 3.477 3.462v5.46h7.049v-10.81L15.413 5.65zm0 12.803a2.128 2.128 0 00-2.124 2.115v5.46h4.248v-5.46A2.127 2.127 0 0015 18.077zm0-16.684L1.403 14.409l.735.732L14.166 4.208l.105-.086c.217-.158.473-.237.73-.237l.127.007c.205.02.404.092.58.214l.126.101 12.028 10.934.734-.732-4.543-4.35a.673.673 0 01-.199-.377l-.009-.108V3.362h-3.127v1.922c0 .559-.634.86-1.067.55l-.079-.064z"/></svg></div> + <div class="details-grid__item-text"> + <dl> + <dt class="details-grid__item-title">Rakennusvuosi</dt> + <dd class="details-grid__item-value">1978</dd> + </dl> + <dl> + <dt class="details-grid__item-title">Rakennuksen tyyppi</dt> + <dd class="details-grid__item-value">Paritalo</dd> + </dl> + </div> + </div> + <div class="details-grid__item"> + <div class="details-grid__item-icon" + aria-hidden="true"><svg height="30" viewBox="0 0 22 30" width="22" xmlns="http://www.w3.org/2000/svg"><path d="M11 0c6.075 0 11 4.971 11 11.104 0 3.433-3.108 9.656-7.794 17.113-1.49 2.377-4.921 2.377-6.412 0C3.108 20.76 0 14.538 0 11.105 0 4.971 4.925 0 11 0zm0 1.854c-5.06 0-9.163 4.142-9.163 9.25 0 2.915 3.058 9.037 7.509 16.121a1.947 1.947 0 003.309 0c4.45-7.084 7.508-13.206 7.508-16.121 0-5.108-4.102-9.25-9.163-9.25zm0 3.234c3.291 0 5.96 2.694 5.96 6.016S14.29 17.12 11 17.12s-5.96-2.694-5.96-6.016S7.71 5.088 11 5.088zm0 1.855c-2.277 0-4.122 1.863-4.122 4.161 0 2.298 1.845 4.161 4.122 4.161s4.122-1.863 4.122-4.161c0-2.298-1.845-4.161-4.122-4.161z"/></svg></div> + <div class="details-grid__item-text"> + <dl> + <dt class="details-grid__item-title">Kaupunginosa</dt> + <dd class="details-grid__item-value">Laajasalo</dd> + </dl> + <dl> + <dt class="details-grid__item-title">Kaupunki</dt> + <dd class="details-grid__item-value">Helsinki</dd> + </dl> + </div> + </div> + </div> + </div> + </div> + + <points-of-interest-info></points-of-interest-info> + + <div + class="content content--primary-background center-on-wallpaper padded padded--v30-h0 padded--desktop-v50-hPage padded--xdesktop-v50-h0 padded--topless"> + <div class="content__section"> + <div class="listing-columns"> + <div class="listing-columns__left"> + <div class="listing-actions"> + <div class="listing-actions__controls"> + <a class="listing-actions__print button button--text customer-color-link js-print-brochure" + href="/nayttoesite/23911499" target="_blank" title="Tulosta ilmoitus"> + <span class="button__icon button__icon--large icon icon--print"></span> + </a> + <favourite-link [card-id]="23911499" + [large-icon]="true" + css="customer-color-link"></favourite-link> + </div> + <div class="listing-actions__share"> + <div class="listing-share"> + <div class="listing-share__caption">Jaa tämä kohde</div> + <div class="listing-share__controls"> + <facebook-share-button + content="kohdesivu" + css="customer-color-link" + card-id="23911499" + card-type="100"> + </facebook-share-button> + <whatsapp-share-button + content="kohdesivu" + css="customer-color-link" + card-id="23911499" + card-type="100" + text="Katso kohde Oikotiellä:"></whatsapp-share-button> + <twitter-share-button + content="kohdesivu" + css="customer-color-link" + card-id="23911499" + card-type="100" + text="Löydä unelmien koti." + hash-tags=""></twitter-share-button> + <email-share-button + content="kohdesivu" + css="customer-color-link" + card-id="23911499" + card-type="100" + title="Hei, katso tämä kohde Oikotiellä" + body="78,5 m² | 305 000 €"> + </email-share-button> + </div> +</div> + </div> +</div> +<div class="listing-overview"> + <p class="paragraph paragraph--keep-formatting margined margined--v20">Tervetuloa Sarvastonkaarelle – kotoisa kaksikerroksinen paritalo meren läheisyydessä tarjoaa viihtyisän ja idyllisen asuinympäristön pienelle perheelle.</p><p class="paragraph paragraph--keep-formatting margined margined--v20">Tässä viehättävässä läpitalon huoneistossa lämpimät sisustussävyt tuovat tiloihin kodikasta tunnelmaa ja viihtyisyyttä. Alakerran avara olohuone ja ruokailutila muodostavat yhtenäisen ja kutsuvan kokonaisuuden, joka soveltuu erinomaisesti sekä arjen että juhlan tarpeisiin. </p><p class="paragraph paragraph--keep-formatting margined margined--v20">Olohuoneen ikkunoista avautuvat näkymät asunnon omalle, tilavalle takapihalle, jossa on tilaa niin grillaukseen, ruokailuun kuin vaikkapa omalle trampoliinillekin. Yläkerrassa sijaitsevat makuuhuoneet lisäävät asumismukavuutta tarjoten yksityisyyttä ja rauhaa. Yläkerrassa on myös tilava kylpyhuone, jonka yhteydessä on sauna sekä vilvoitteluparveke. +Huoneistolle kuuluu myös reilunkokoinen ulkovarasto sekä oma parkkipaikka.</p><p class="paragraph paragraph--keep-formatting margined margined--v20">Asunto sijaitsee yhteisöllisessä ja arvostetussa taloyhtiössä, joka on vuonna 2011 palkittu pääkaupunkiseudun mukavimpana taloyhtiönä. Yhtiön 107 asuntoa on ripoteltu viiden pihan ympärille, joista jokainen on itsessään oma leikkikenttänsä tehden paikasta lapsiystävällisen ja kylämäisen. Asukkailla on monipuolista yhteistä toimintaa ja taloyhtiön kerhohuoneella kokoontuvat muun muassa nyrkkeilyryhmä, lasten taidekerho, joogaajat ja tanssijat. Asukkaat voivat varata tilaa maksutta myös omaan käyttöön, kuten lastenjuhliin. Kerhohuoneen yhteydessä on myös pesutupa.</p><p class="paragraph paragraph--keep-formatting margined margined--v20">Taloyhtiöön on vuosien saatossa tehty useita merkittäviä kunnostuksia. Tulevia remontteja suunnitellaan ja tehdään järjestelmällisesti yhtiön arvon ja kunnon säilyttämiseksi. Tämä varmistaa myös asukkailleen miellyttävän asuinympäristön pitkälle tulevaisuuteen. Seuraavan viiden vuoden korjaussuunnitelmassa ei ole tiedossa suuria hankkeita.</p><p class="paragraph paragraph--keep-formatting margined margined--v20">Laajasalon saari on lapsiperheiden rakastama kotisaari, jossa on hyvä olla ja elää. Alueen harrastusmahdollisuudet aktiiviselle perheelle ovat erinomaiset ja seuratoiminta näiden puitteissa monipuolista. Laajasalon alueella on useita harraste- ja liikuntatiloja, uimarantoja, sekä upeat ulkoilumaastot ja merenrannan rantareitit, jotka lähtevät lähes kotiovelta. Lähistöltä, löytyvät leikkipuistot, päiväkodit, ylä- ja alakoulut ja kattavat päivittäispalvelut ovat kauppakeskus Saaressa, reilun kilometrin päässä.</p><p class="paragraph paragraph--keep-formatting margined margined--v20">Lyhyt matka Sarvaston venesatamaan mahdollistaa myös merelliset harrasteet.</p><p class="paragraph paragraph--keep-formatting margined margined--v20">Lämpimästi tervetuloa tutustumaan – hurmaavat puitteet ja tilava takapiha tekevät varmasti vaikutuksen!</p><p class="paragraph paragraph--keep-formatting margined margined--v20">Pia Lundenberg, +040 522 1967 | pia.lundenberg@bo.fi</p><p class="paragraph paragraph--keep-formatting margined margined--v20">OLETKO MYYMÄSSÄ ASUNTOASI?</p><p class="paragraph paragraph--keep-formatting margined margined--v20">Varaa minut helposti kalenterini kautta arvioimaan kotiasi.</p><p class="paragraph paragraph--keep-formatting paragraph--prevent-overflow margined margined--v30">https://bo.fi/henkilo/pia-lundenberg/#kalenteri +</p> </div> + <viewings></viewings> + + <div id="side02-mobile"></div> + + <div class="listing-details-container"> + <div class="listing-details"> + <h3 class="heading heading--title-2">Perustiedot </h3> + <dl class="info-table"> + <div class="info-table__row"> + <dt class="info-table__title">Sijainti</dt> + <dd class="info-table__value"><a href="/myytavat-asunnot?locations=%5B%22Sarvastonkaari%2CHelsinki%22%5D" target="_self" class="link link--text-only"><span class="link__text">Sarvastonkaari</span></a> 3 G, <a href="/myytavat-asunnot?locations=%5B%2200840%2CHelsinki%22%5D" target="_self" class="link link--text-only"><span class="link__text">00840</span></a> <a href="/myytavat-asunnot/helsinki" target="_self" class="link link--text-only"><span class="link__text">Helsinki</span></a></dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Kaupunginosa</dt> + <dd class="info-table__value"><a href="/myytavat-asunnot/helsinki/laajasalo" target="_self" class="link customer-color-link" analytics-click="listing_details_district_click" analytics-click-label="Laajasalo"><span class="link__text">Laajasalo</span></a></dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Kohdenumero</dt> + <dd class="info-table__value">21055475</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Kerros</dt> + <dd class="info-table__value">2 / 2</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Asuinpinta-ala</dt> + <dd class="info-table__value">78,5 m²</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Tontin pinta-ala</dt> + <dd class="info-table__value">3,01 ha</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Kokonaispinta-ala</dt> + <dd class="info-table__value">78,5 m²</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Pinta-alojen lisätiedot</dt> + <dd class="info-table__value info-table__value--preserve-newlines">yhtiöjärjestyksen mukainen, isännöitsijäntodistuksen mukainen Mainittu pinta-ala saattaa tämän ikäisessä kohteessa (rakennettu ennen vuotta 1992) poiketa olennaisesti nykyisten standardien mukaan laskettavasta asuinpinta-alasta. Todellinen asuinpinta-ala voi tarkistusmittauksen jälkeen olla yhtiöjärjestyksessä, isännöitsijäntodistuksessa ja esitteessä mainittua pienempi tai suurempi. Pinta-alaa ei ole tarkistusmitattu.</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Huoneiston kokoonpano</dt> + <dd class="info-table__value">3h, avok. kph, s (yj. mukaan 3h+k+s)</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Huoneita</dt> + <dd class="info-table__value">3</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Kunto</dt> + <dd class="info-table__value">Tyydyttävä</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Lisätietoa vapautumisesta</dt> + <dd class="info-table__value">sopimuksen mukaan</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Keittiön varusteet</dt> + <dd class="info-table__value">Liesi: induktio, erillisuuni, liesitaso. Työtasot: laminaatti. Kylmäsäilytys: jääkaappi/pakastin. Varustus: liesituuletin, astianpesukone, kiinteät valaisimet. </dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Parveke</dt> + <dd class="info-table__value">Kyllä</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Parvekkeen lisätiedot</dt> + <dd class="info-table__value">Tyyppi: ulostyönnetty, muu. Suunta: itä</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Kylpyhuoneen varusteet</dt> + <dd class="info-table__value">Pesutilojen kuvaus: Kph:n katto puupaneloitu. Varustus: suihkuseinä, pesukoneliitäntä, lattialämmitys, wc-istuin, suihku, peili, kiinteät valaisimet, kylpyhuonekaapisto, asennettuja erikoisvarusteita. </dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Säilytystilat</dt> + <dd class="info-table__value">Kuvaus: Huoneistoon kuuluu erillinen suuri ulkovarasto, n. 6 neliötä. Ulkovarastossa on vesipiste.ulkovarasto</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Näkymät</dt> + <dd class="info-table__value">Läpitalon huoneisto, keittiö ja toinen makuuhuone, n. lännen suuntaan, ja makuuhuone ja oh idän suuntaan. +Takapihalta kauniit näkymät Sarvaston venesataman suuntaan. Takapihan puolella terassi n. 25 neliötä, jonka jatkeena aidattu takapiha n. 100 neliötä, joka rajautuu puistoon, alue on kaavoitettu puistoalueeksi, johon ei ole suunniteltu rakentamista. +</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Tulevat remontit</dt> + <dd class="info-table__value info-table__value--preserve-newlines">Tulevat suunnitellut korjaushankkeet vuosille 2025 - 2033 +2025 Maalausurakan takuutarkastus, 7-2025 mennessä, aloitus keväällä 2025 +2025 Jatketaan kattojen pinnoitusten uusimista +2025–2028 Aitojen pienkorjauksia +2026 Ikkunoiden takuutarkastus, 10-2026 mennessä +2026 Taloyhtiön kuntoarvio ja kaikkien märkätilojen kartoitus +2025-2026 Taloyhtiön kylttien ja opasteiden uusiminen +2027 Asuntojen numerovalojen uusiminen +2033 Palovaroittiminen uusiminen</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Tehdyt remontit</dt> + <dd class="info-table__value info-table__value--preserve-newlines">Huoneistosta on poistettu alakerran WC:n parikymmentä vuotta sitten, muutostyöstä ei ole saatavilla asiakirjoja. TALOYHTIÖSSÄ: 2025 Palovaroittimien asennus, H-talon vajonneita viemäreitä ja kannakkeita uusittiin ja korjattiin. +2024 Sähköjärjestelmien huoltokierros +2024 Ikkunoiden uusiminen ja terassiovien osittainen uusiminen +2024 Leikkipaikkojen turvallisuuden parantaminen +2023 Asuintalojen, varastojen ja huoltorakennuksen julkisivujen huoltomaalaus, sekä +päätyasuntojen varastojen seinien lahovauriokorjaus +2023 Käyttövesijärjestelmän tasapainotus +2023 Kattojen huoltotarkastus ja pienkorjaukset +2022 Kerhotilan kunnostus +2022 Sähköautojen latauspisteiden asennus +2021 Lämmönjakohuoneen saneeraus +2021 Pysäköintialueiden saneeraus ja sähköistyksen uusiminen +2020 Aitojen kunnostus ja maalaus +2019 Parvekkeiden kuntotarkastus +2019 IV-kanavien/hormien nuohous +2018 Ikkunoiden kuntotarkastus +2015 Kaapeli-TV +2015 Taloyhtiölaajakaista +2014 Postilaatikot +2013 Aidat +2013 Valaistuksen kunnostus/lisääminen +2013 Ovien kunnostaminen +2012 Seinärakenteen peruskorjaus +2012 Kattojen huoltomaalaus +2011 Leikkipaikat ja lukitus +2008 Alapohjan peruskorjaus +2005 Lämmitysjärjestelmän tasapainotus +2005 Koekorjaussuunnitelma +2004 Kosteuskartoitus +2004 Maaperämittaus +2004 Antennijärjestelmän digitalisointi +2003 Kuntoarvio +2002 Käyttövesiputket uusittu +1999 Parvekkeet</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Rannan omistus</dt> + <dd class="info-table__value">Ei rantaa</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Asunnossa sauna</dt> + <dd class="info-table__value">Kyllä</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Saunan lisätiedot</dt> + <dd class="info-table__value">Kuvaus: Sauna kokonaan paneloitu. sähkökiuas</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Asumistyyppi</dt> + <dd class="info-table__value">Omistus</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Lisätiedot</dt> + <dd class="info-table__value"> Muuta kauppaan kuuluvaa: Olohuoneessa on puusepän tekemä, katonrajassa huonetta kiertävä kirjahylly, joka jää asuntoon.</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Kohde on</dt> + <dd class="info-table__value">Osakehuoneisto</dd> + </div> + <div class="info-table__row info-table__row--last"> + <dt class="info-table__title">Tietoliikennepalvelut</dt> + <dd class="info-table__value">laajakaista</dd> + </div> + </dl> + </div> + <div class="listing-details"> + <h3 class="heading heading--title-2">Hinta </h3> + <dl class="info-table"> + <div class="info-table__row"> + <dt class="info-table__title">Velaton hinta</dt> + <dd class="info-table__value">305 000 €</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Myyntihinta</dt> + <dd class="info-table__value">291 651,64 €</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Lainaosuuden maksu</dt> + <dd class="info-table__value">Kyllä</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Neliöhinta</dt> + <dd class="info-table__value">3 885,35 € / m²</dd> + </div> + <div class="info-table__row info-table__row--last"> + <dt class="info-table__title">Velkaosuus</dt> + <dd class="info-table__value">13 348,36 €</dd> + </div> + <div class="info-table__info-boxes padded padded--v15-h0"> + <div class="info-table__info-box padded padded--v15-h15"> + <dt class="info-table__title info-table__title--box">Lisätietoa velkaosuudesta</dt> + <dd class="info-table__value info-table__value--full-width">POV2 Nordea -1142 Parkkipaikka 4 025,25 e<br /> +POV3 Nordea -6813 julkisivumaalaus 3 159,25 e<br /> +POV4 Hypo -0420 Ikkunat ja terassiovet 6 163,86 e</dd> + </div> + </div> + </dl> + </div> + <div class="listing-page-calculator listing-page-calculator--mobile"> + + +<div class="loan-calculator nordea-calculator-wrapper"> + <div class="nordea-calculator-wrapper__logo margined margined--v30"> + <svg xmlns="http://www.w3.org/2000/svg" width="192" height="40" viewBox="140.95 90.53 564.96 117.71"> + <path + d="M5146.29 476.91c-5.83-114-107.02-202.808-225.36-188.211-90.49 11.172-163.25 84.871-173.39 175.492-13.53 120.879 80.71 223.25 198.86 223.25 107.06 0 194.48-84.062 199.89-189.781zm-227.22 356.817c-172.45-13.344-308.69-152.907-319.46-323.965C4586.9 307.66 4747.04 140.23 4946.4 140.23c72.03 0 169.52 35.829 213.33 111.45V149.531h134.47l.28 331.278c0 215.722-175.65 368.379-375.41 352.918M3989.53 501.59c0 72.64 42.38 156.051 136.48 191.379 106.83 40.105 200.17-13.11 239.49-88.071zm194.74 333.09c-182.63-5.125-339.61-147.321-339.61-351.008 0-187.742 152.01-344.692 347.68-344.703 136.41-.008 269.72 82.23 322.46 215.672l-133.86 39.929c-24.22-54.75-82.7-102.582-150.23-115.172-94.04-17.519-180.62 39.993-214.59 104.071l520.78 141.91c-15.38 133.75-132.71 315.473-352.63 309.301M3038.39 693.52v142.679c-129.84 0-175.84-63.984-195.32-99.39v76.597H2695V149.531h152.04c-.13 205.278-.44 201.891-.44 325.719 0 153.391 88.65 213.07 191.79 218.27M1666.25 416.262 1212.19 951.02h-155.02V150.629h160.25V685.91l459.77-536.379h142.09l.08 801.489h-153.11V416.262M3603.93 476.91c-5.83-114-107.02-202.808-225.36-188.211-90.49 11.172-163.25 84.871-173.39 175.492-13.53 120.879 80.71 223.25 198.86 223.25 107.06 0 194.48-84.062 199.89-189.781zm147.52 544.91h-143.16V760.789c-34.01 44.695-140.21 80.332-231.58 72.938-170.84-13.829-308.69-152.907-319.46-323.965-12.71-202.102 147.44-369.973 346.79-369.973 74.41 0 177.99 35.621 213.33 98.5l-.15-88.758h134.23v331.278c.03 2.152.08 4.312.08 6.472 0 2.168-.05 4.321-.08 6.481v528.058M2256.61 287.281c-110.46 0-200.01 89.539-200.01 200 0 110.457 89.55 200.008 200.01 200.008s200-89.551 200-200.008c0-110.461-89.54-200-200-200zm.42 547.903c-192.14 0-347.9-155.762-347.9-347.903 0-192.14 155.76-347.902 347.9-347.902s347.9 155.762 347.9 347.902c0 192.141-155.76 347.903-347.9 347.903M4368.74 605.578" + style="fill:#333092;fill-opacity:1;fill-rule:nonzero;stroke:none" transform="matrix(.13333 0 0 -.13333 0 226.773)"></path> + </svg> + </div> + <div> + <nordea-loan-calculator-v2 + [bank-id]="1" + calculator-type="mobile" + [card-id]="23911499" + [default-own-capital]="0" + [default-loan-interest]="2.836" + [default-years]="25" + [default-loan-amount]="305000"> + </nordea-loan-calculator-v2> + </div> +</div> + </div> + + + <div class="listing-details"> + <h3 class="heading heading--title-2">Vastikkeet </h3> + <dl class="info-table"> + <div class="info-table__row"> + <dt class="info-table__title">Hoitovastike</dt> + <dd class="info-table__value">525,95 € / kk</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Pääomavastike</dt> + <dd class="info-table__value">117,77 € / kk</dd> + </div> + <div class="info-table__row info-table__row--last"> + <dt class="info-table__title">Yhtiövastike yhteensä</dt> + <dd class="info-table__value strong">643,72 € / kk</dd> + </div> + <div class="info-table__info-boxes padded padded--v15-h0"> + <div class="info-table__info-box padded padded--v15-h15"> + <dt class="info-table__title info-table__title--box">Lisätietoa vastikkeista</dt> + <dd class="info-table__value info-table__value--full-width"><p class="margined margined--v5">Pov 4 Ikkunat ja terassiovet, 0,0088 € / os (48,88 € / kk)<br /> +Pov 3 julkisivu maalaus, 0,0054 € / os (30 € /kk)<br /> +Pov 2 parkkipaikka, 0,007 € /os (38,89 € / kk)</p></dd> + </div> + </div> + </dl> + </div> + <div class="listing-details"> + <h3 class="heading heading--title-2">Muut maksut </h3> + <dl class="info-table"> + <div class="info-table__row"> + <dt class="info-table__title">Vesimaksun lisätiedot</dt> + <dd class="info-table__value">sisältyy vastikkeeseen</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Muut kustannukset</dt> + <dd class="info-table__value info-table__value--preserve-newlines">Muut maksut: Vähintään kerran vuodessa suoritetaan tasauslaskutus todellista kulutusta vastaavaksi. +Pesutupamaksu 1 € / krt +Sähkömaksut, autosähkölataus 14,5 c / kWh +Käyttösähkö kulutuksen mukaan/ oman sähkösopimuksen mukaisesti +Kotivakuutusmaksut omien sopimusehtojen mukaisesti +Varainsiirtovero 1,5 % velattomasta kauppahinnasta + +Yhtiön osakeluettelo on siirretty Maanmittauslaitoksen huoneistotietojärjestelmään. Ostajan tulee hakea omistusoikeuden rekisteröintiä Maanmittauslaitokselta kaupan jälkeen. Ostaja vastaa omistusoikeuden rekisteröintikustannuksista, mahdollisista osakekirjan mitätöinnistä aiheutuvista kustannuksista sekä mahdollisesta hakemusmaksun korotuksesta. Ostajan pankin ostajalta mahdollisesti veloittamista omistuksen rekisteröintiin liittyvistä kuluista ostaja saa tiedon pankiltaan.</dd> + </div> + <div class="info-table__row info-table__row--last"> + <dt class="sr-only"></dt> + <dd class="info-table__value info-table__value--full-width"><ul class="link-list"><li class="link-list__item"><a class="customer-color-link" analytics-impression="insurance_link_impression" href="/vakuutukset/23911499" target="_self"> +Tarkista uuden tai nykyisen kotisi kotivakuutuksen hinta ja ehdot</a></li></ul></dd> + </div> + </dl> + </div> + <div class="listing-details"> + <h3 class="heading heading--title-2">Talon ja tontin tiedot </h3> + <dl class="info-table"> + <div class="info-table__row"> + <dt class="info-table__title">Uudiskohde</dt> + <dd class="info-table__value">Ei</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Taloyhtiön nimi</dt> + <dd class="info-table__value">Asunto-oy Sarvastonkaari</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Rakennuksen tyyppi</dt> + <dd class="info-table__value">Paritalo</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Rakennusvuosi</dt> + <dd class="info-table__value">1978</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Huoneistojen lukumäärä</dt> + <dd class="info-table__value">107</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Kerroksia</dt> + <dd class="info-table__value">2</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Taloyhtiössä on sauna</dt> + <dd class="info-table__value">Kyllä</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Rakennusmateriaali</dt> + <dd class="info-table__value">puu, betoni</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Kattomateriaali</dt> + <dd class="info-table__value">Peltikate</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Kattotyyppi</dt> + <dd class="info-table__value">Harjakatto</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Energialuokka</dt> + <dd class="info-table__value">D2018 Viimeinen voimassoloaika 13.8.2034 +E-luku 167</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Energiatodistus</dt> + <dd class="info-table__value">Kyllä</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Kiinteistön antennijärjestelmä</dt> + <dd class="info-table__value">kaapeli-tv</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Tontin koko</dt> + <dd class="info-table__value">3,01 ha</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Kiinteistönhoito</dt> + <dd class="info-table__value">huoltoyhtiö. Kiinteistönhoidon lisätiedot: Kotikatu Oy Laajasalo</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Isännöinti</dt> + <dd class="info-table__value">Fluxio Isännöinti Oy +Isännöitsijä Markku Laakso p. 0103390533 +asiakaspalvelu@fluxio.fi</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Kaavoitustiedot</dt> + <dd class="info-table__value">Helsingin Kaupunki, kartta.hel.fi | aineistot | kaavoitus ja liikennesuunnittelu. +Puh. 09 310 221 11</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Kaavatilanne</dt> + <dd class="info-table__value">Asemakaava</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Lämmitys</dt> + <dd class="info-table__value">Kaukolämpö</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Lisätietoja lämmityksestä</dt> + <dd class="info-table__value">Ilmanvaihtojärjestelmä: painovoimainen</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Tontin vuokra päättyy</dt> + <dd class="info-table__value">31.12.2040</dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Maanvuokraaja</dt> + <dd class="info-table__value">Helsingin kaupunki</dd> + </div> + <div class="info-table__row info-table__row--last"> + <dt class="info-table__title">Tontin omistus</dt> + <dd class="info-table__value">Vuokralla</dd> + </div> + </dl> + </div> + <broadband-promotion-valokuitunen page-type="listing"></broadband-promotion-valokuitunen> + <div class="listing-details"> + <h3 class="heading heading--title-2">Tilat ja materiaalit </h3> + <dl class="info-table"> + <div class="info-table__row"> + <dt class="info-table__title">Yhteiset tilat</dt> + <dd class="info-table__value info-table__value--preserve-newlines">sauna, talopesula, kuivaushuone, mankeli, askarteluhuone, Huoneistokohtaiset varastot. Taloyhtiössä muuta: Yhtiön piha-alueella on viisi pientä pihaa, joissa on lasten leikkipaikat. +Kerhotiloissa järjestetään osakkaiden toimesta; lasten taidekerho, joogaa, kuntonyrkkeilyä, kahvakuula treenejä. +Yhteisöllinen ja lapsiperheiden suosima taloyhtiö. +Helsingin Sanomien Nyt-liite palkitsi taloyhtiön pääkaupunkiseudun mukavimpana vuonna 2011. + +Yhtiöjärjestyksessä määrätään kunnossapitovastuun jakautumisesta yhtiön ja osakkeenomistajan kesken. +Osakaskohtaisten lisärakenteiden (parveke, kuistien katokset valokatteineen, terassi, jälkirakennettu parvi) kunnossapito kuuluu osakkaan vastuulle (Yj. 14 §). +Osakkaat voivat asentaa viilentävän ilmalämpöpumpun (YJ. 20 §), jota varten tehdään erillinen sopimus ja muutostyöilmoitus isännöintitoimistoon. + +Yhtiökokous päätöksiä 24.4.2025 +Taloyhtiön asentamien palovaroittimien säännöllinen testaus on osakkaiden vastuulla. +Taloyhtiö tulee liittymään Helenin Optimilämpöjärjestelmään, jos se on teknisesti mahdollista. Tavoitteena on vähentää energian kulutusta. Lisäksi taloyhtiö saa lämmitysenergiaan pienen alennuksen, kun järjestelmä on liitetty. +Todettiin, että pääomavastikelaina 2 parkkipaikka on siirretty Nordealle. + +Ylimääräisen yhtiökokouksen päätökset 21.1.2025 +Handelsbanken on ilmoittanut, että se irtisanoo yksipuolisesti taloyhtiölainat irti, tai heikentää niiden ehtoja 30.6.2025 alkaen. Hallituksen mielestä parhaan tarjouksen antoi Sarvastonkaaren ns. kotipankki Nordea, jonka lainan korko on 6kk Euribor +0,65 % marginaali. Marginaalin ensimmäinen tarkastusajankohta on kolmen (3) vuoden kuluttua. Tarjouksen marginaali on samansuuruinen kuin nykyisessä lainassa, vaikka lainasumma on pienentynyt. + +. </dd> + </div> + <div class="info-table__row"> + <dt class="info-table__title">Pintamateriaalit</dt> + <dd class="info-table__value info-table__value--preserve-newlines">Lattia: Keittiössä: laatta. Pesutiloissa: laatta. Olohuoneessa: parketti. Makuuhuoneessa: parketti. Saunassa: laatta. Seinät: Keittiössä: maalattu. Pesutiloissa: kaakeli. Olohuoneessa: maalattu, tapetti. Makuuhuoneessa: maalattu. Saunassa: muu.</dd> + </div> + <div class="info-table__row info-table__row--last"> + <dt class="info-table__title">Olohuoneen varusteet</dt> + <dd class="info-table__value">Olohuoneessa yksi seinä tapetoitu, loput maalattu. Lattia maalattu parketti.</dd> + </div> + </dl> + </div> + + <energy-promotion-listing [card-type]="100" + [size]="78.5" + domain="asunnot"></energy-promotion-listing> + + </div> + + <div class="listing-grid listing-lift-container"> + <div class="listing-grid__item"> + <a class="link link--muted link--text-only listing-lift customer-color-border-hover" href="/myytavat-asunnot/helsinki/laajasalo" target="_self"> + <i class="listing-lift__icon link__icon icon-OT5 icon-OT5--alue icon-OT5--large customer-color-text"></i> <div> + <h4 class="listing-lift__title">Alueen muut kohteet</h4> + <h5 class="listing-lift__text">Laajasalo, Helsinki</h5> + </div> + </a> +</div> + </div> + </div> + <div class="listing-columns__neighbourhood-profile"> + <neighbourhood-profile-container> + <neighbourhood-profile></neighbourhood-profile> + </neighbourhood-profile-container> + </div> + <div class="listing-columns__right"> + <listing-contact></listing-contact> + <div class="listing-page-calculator listing-page-calculator--desktop"> + + +<div class="loan-calculator nordea-calculator-wrapper"> + <div class="nordea-calculator-wrapper__logo margined margined--v30"> + <svg xmlns="http://www.w3.org/2000/svg" width="192" height="40" viewBox="140.95 90.53 564.96 117.71"> + <path + d="M5146.29 476.91c-5.83-114-107.02-202.808-225.36-188.211-90.49 11.172-163.25 84.871-173.39 175.492-13.53 120.879 80.71 223.25 198.86 223.25 107.06 0 194.48-84.062 199.89-189.781zm-227.22 356.817c-172.45-13.344-308.69-152.907-319.46-323.965C4586.9 307.66 4747.04 140.23 4946.4 140.23c72.03 0 169.52 35.829 213.33 111.45V149.531h134.47l.28 331.278c0 215.722-175.65 368.379-375.41 352.918M3989.53 501.59c0 72.64 42.38 156.051 136.48 191.379 106.83 40.105 200.17-13.11 239.49-88.071zm194.74 333.09c-182.63-5.125-339.61-147.321-339.61-351.008 0-187.742 152.01-344.692 347.68-344.703 136.41-.008 269.72 82.23 322.46 215.672l-133.86 39.929c-24.22-54.75-82.7-102.582-150.23-115.172-94.04-17.519-180.62 39.993-214.59 104.071l520.78 141.91c-15.38 133.75-132.71 315.473-352.63 309.301M3038.39 693.52v142.679c-129.84 0-175.84-63.984-195.32-99.39v76.597H2695V149.531h152.04c-.13 205.278-.44 201.891-.44 325.719 0 153.391 88.65 213.07 191.79 218.27M1666.25 416.262 1212.19 951.02h-155.02V150.629h160.25V685.91l459.77-536.379h142.09l.08 801.489h-153.11V416.262M3603.93 476.91c-5.83-114-107.02-202.808-225.36-188.211-90.49 11.172-163.25 84.871-173.39 175.492-13.53 120.879 80.71 223.25 198.86 223.25 107.06 0 194.48-84.062 199.89-189.781zm147.52 544.91h-143.16V760.789c-34.01 44.695-140.21 80.332-231.58 72.938-170.84-13.829-308.69-152.907-319.46-323.965-12.71-202.102 147.44-369.973 346.79-369.973 74.41 0 177.99 35.621 213.33 98.5l-.15-88.758h134.23v331.278c.03 2.152.08 4.312.08 6.472 0 2.168-.05 4.321-.08 6.481v528.058M2256.61 287.281c-110.46 0-200.01 89.539-200.01 200 0 110.457 89.55 200.008 200.01 200.008s200-89.551 200-200.008c0-110.461-89.54-200-200-200zm.42 547.903c-192.14 0-347.9-155.762-347.9-347.903 0-192.14 155.76-347.902 347.9-347.902s347.9 155.762 347.9 347.902c0 192.141-155.76 347.903-347.9 347.903M4368.74 605.578" + style="fill:#333092;fill-opacity:1;fill-rule:nonzero;stroke:none" transform="matrix(.13333 0 0 -.13333 0 226.773)"></path> + </svg> + </div> + <div> + <nordea-loan-calculator-v2 + [bank-id]="1" + calculator-type="desktop" + [card-id]="23911499" + [default-own-capital]="0" + [default-loan-interest]="2.836" + [default-years]="25" + [default-loan-amount]="305000"> + </nordea-loan-calculator-v2> + </div> +</div> + </div> + </div> + <div class="listing-columns__banner cts-middlebanner"> + <ad-unit target-id="banner_bottom"></ad-unit> + </div> + </div> + </div> + </div> +</section> + + <has-recommendations> + <div + class="content content--primary-background content--border-top center-on-wallpaper padded padded--v30-h0 padded--desktop-v50-hPage padded--xdesktop-v50-h0"> + <div class="content__section"> + <recommendations [company-recommendations]="1"></recommendations> + </div> + </div> + </has-recommendations> + <div + class="content content--primary-background content--border-top center-on-wallpaper padded padded--v30-h0 padded--desktop-v50-hPage padded--xdesktop-v50-h0"> + <div class="content__section"> + <div class="articles-feed"> + <h2 class="heading heading--title-2 articles-feed__title">Oikotie suosittelee</h2> + <div class="articles-feed__content" analytics-impression="articles_feed_impression"> + <a class="articles-feed__content-piece link link--text-only" + analytics-click="articles_feed_click" + analytics-click-meta="Tallenna hakusi hakuvahdiksi" + href="https://asunnot.oikotie.fi/artikkelit/asuminen/hakuvahti/" + target="_self" + aria-label="Oikotie Asunnot -artikkeli"> + <article class="articles-feed-entry"> + <div role="img" + class="articles-feed-entry__image" + lazy-background-image="https://cdn.asunnot.oikotie.fi/GuOOMtOIfNG_Ey1j_4CQEmmI3pE=/full-fit-in/768x506/filters:format(jpeg):quality(50)/https%3A%2F%2Fwordpress.asunnot.oikotie.fi%2Fapp%2Fuploads%2F2025%2F11%2F13161101%2Ffb-jakokuvat-1.png"> + </div> + <div class="articles-feed-entry__content articles-feed-entry__content--bordered"> + <header> + <div class="articles-feed-entry__category">Asuminen</div> + <h3 class="articles-feed-entry__title">Tallenna hakusi hakuvahdiksi</h3> + </header> + <p class="articles-feed-entry__summary">Kun etsit asuntoa, loma-asuntoa, autopaikkaa, tonttia, maa-tai metsätilaa, varastoa tai vaikka autopaikkaa voit tallentaa haun itsellesi hakuvahdiksi ja saat tiedon aina kun hakuasi vastaava kohde tulee tarjottavaksi. Hakuvahdin tekeminen: Mene Oikotien Asuntojen etusivulle ja kirjaudu Oikotielle. Syötä hakukriteerisi hakukoneeseen ja tallenna hakuvahdiksi. Saa tieto aina, kun hakuasi vastaava kohde tulee tarjolle. Hakuvahdin muokkaus Selaimessa: Mene Oikotien Asuntojen etusivulle ja kirjaudu Oikotielle. […] +</p> + </div> + </article> + </a> + <a class="articles-feed__content-piece link link--text-only" + analytics-click="articles_feed_click" + analytics-click-meta="Vuoden 2025 edullisimmat myytävät kodit TOP 5 + 1" + href="https://asunnot.oikotie.fi/artikkelit/asuminen/vuoden-2025-edullisimmat/" + target="_self" + aria-label="Oikotie Asunnot -artikkeli"> + <article class="articles-feed-entry"> + <div role="img" + class="articles-feed-entry__image" + lazy-background-image="https://cdn.asunnot.oikotie.fi/Ag6USx1aq7GfqCVp1hr6sw7vSwM=/full-fit-in/768x506/filters:format(jpeg):quality(50)/https%3A%2F%2Fwordpress.asunnot.oikotie.fi%2Fapp%2Fuploads%2F2025%2F11%2F12105234%2Fpienin.png"> + </div> + <div class="articles-feed-entry__content articles-feed-entry__content--bordered"> + <header> + <div class="articles-feed-entry__category">Asuminen</div> + <h3 class="articles-feed-entry__title">Vuoden 2025 edullisimmat myytävät kodit TOP 5 + 1</h3> + </header> + <p class="articles-feed-entry__summary">Mitä saa, kun budjetti on vain muutamia tuhansia euroja? Ja voiko kodin todella ostaa auton hinnalla? Oikotiellä vierailee viikoittain noin 1,1 miljoonaa käyttäjää, ja tarjolla on koteja joka lähtöön. Vaikka moni viihtyy luksuskartanoiden parissa haaveillen, toisia kiinnostaa se toinen ääripää: kodit, joissa oma rauha ja katto pään päällä löytyvät yllättävän edullisesti. Pienellä rahalla hankitut asunnot […] +</p> + </div> + </article> + </a> + </div> +</div> + </div> + </div> + <listing-contact-bottom></listing-contact-bottom> + <listing-contact-mobile></listing-contact-mobile> +<oikotie-app-popup></oikotie-app-popup> + <script> + const apiUrl = new URL('https://asunnot.oikotie.fi/card/card-visit-count?card_id=23911499&random=1317787367'); + const currentUrl = new URL(window.location.href); + const srcParam = currentUrl.searchParams.get('src'); + if (srcParam !== null) { + currentUrl.searchParams.delete('src'); + window.history.replaceState({}, '', currentUrl.href); + apiUrl.searchParams.set('src', srcParam); + } + const newScript = document.createElement('script'); + newScript.src = apiUrl.href; + const currentScript = document.currentScript; + currentScript.parentNode.insertBefore(newScript, currentScript.nextSibling); +</script> + <app-root></app-root> +</main> + + <div class="page-bottom hidden-embedded center-on-wallpaper"> + <div class="content content--primary-background content--border-top padded padded--v30-hPage padded--desktop-v50-hPage padded--xdesktop-v50-h0"> + <div class="content__section"> + <div class="footer-logo"> + <a class="footer-logo__logo" href="https://asunnot.oikotie.fi/myytavat-asunnot" target="_self"> + <img alt="Oikotie Asunnot" loading="lazy" src="https://cdn.asunnot.oikotie.fi/images/svg/oikotie_asunnot_vertical_black.svg" width="120" height="51"> + </a> + </div> + <div class="footer-relevant-locations"> + <div class="footer-relevant-locations__section"> + <h3 class="footer-relevant-locations__title">Muita suosittuja kaupunkeja</h3> + <div first-of-line="footer-relevant-locations__location--first-of-line" class="footer-relevant-locations__locations"> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki" + target="_self">Helsinki</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/vantaa" + target="_self">Vantaa</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/espoo" + target="_self">Espoo</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/kerava" + target="_self">Kerava</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/sipoo" + target="_self">Sipoo</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/kauniainen" + target="_self">Kauniainen</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/j%C3%A4rvenp%C3%A4%C3%A4" + target="_self">Järvenpää</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/porvoo" + target="_self">Porvoo</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/tuusula" + target="_self">Tuusula</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/kirkkonummi" + target="_self">Kirkkonummi</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/nurmij%C3%A4rvi" + target="_self">Nurmijärvi</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/vihti" + target="_self">Vihti</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/askola" + target="_self">Askola</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/pornainen" + target="_self">Pornainen</a> + </span> + </div> + </div> + <div class="footer-relevant-locations__section"> + <h3 class="footer-relevant-locations__title">Muita suosittuja kaupunginosia</h3> + <div first-of-line="footer-relevant-locations__location--first-of-line" class="footer-relevant-locations__locations"> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/laajasalo" + target="_self">Laajasalo</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/kruunuvuorenranta" + target="_self">Kruunuvuorenranta</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/hernesaari" + target="_self">Hernesaari</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/jollas" + target="_self">Jollas</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/yliskyl%C3%A4" + target="_self">Yliskylä</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/kaitalahti" + target="_self">Kaitalahti</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/tullisaari" + target="_self">Tullisaari</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/hevossalmi" + target="_self">Hevossalmi</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/kaakkoinen" + target="_self">Kaakkoinen</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/herttoniemi" + target="_self">Herttoniemi</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/aurinkolahti" + target="_self">Aurinkolahti</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/herttoniemenranta" + target="_self">Herttoniemenranta</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/roihupelto" + target="_self">Roihupelto</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/keski-vuosaari" + target="_self">Keski-Vuosaari</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/roihuvuori" + target="_self">Roihuvuori</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/kallahti" + target="_self">Kallahti</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/meri-rastila" + target="_self">Meri-Rastila</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/marjaniemi" + target="_self">Marjaniemi</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/kulosaari" + target="_self">Kulosaari</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/tammisalo" + target="_self">Tammisalo</a> + </span> + <span class="footer-relevant-locations__location"> + <a class="footer-relevant-locations__link link" + href="/myytavat-asunnot/helsinki/viikinranta" + target="_self">Viikinranta</a> + </span> + </div> + </div> + </div> + <div class="some-links"> + <div class="some-links__title">Seuraa meitä</div> + <ul class="some-links__list"> + <li class="some-links__list-item"> + <a target="_blank" rel="nofollow noopener" title="Seuraa Facebookissa" + href="https://fi-fi.facebook.com/oikotieasunnot" + class="link link--has-icon social-media-link "> + <i class="link__icon social-media-link__icon icon icon--facebook" + role="img" aria-label="Seuraa Facebookissa"></i> + </a> + </li> + <li class="some-links__list-item"> + <a target="_blank" rel="nofollow noopener" title="Seuraa Twitterissä" + href="https://x.com/OikotieAsunnot" + class="link link--has-icon social-media-link "> + <i class="link__icon social-media-link__icon icon icon--twitter" + role="img" aria-label="Seuraa Twitterissä"></i> + </a> + </li> + <li class="some-links__list-item"> + <a target="_blank" rel="nofollow noopener" title="Seuraa Instagramissa" + href="https://instagram.com/oikotieasunnot/" + class="link link--has-icon social-media-link "> + <i class="link__icon social-media-link__icon icon icon--instagram" + role="img" aria-label="Seuraa Instagramissa"></i> + </a> + </li> + </ul> +</div> + </div> +</div> +<section + class="content content--primary-background content--border-top padded padded--v30-hPage padded--desktop-v50-hPage padded--xdesktop-v50-h0"> + <div class="content__section"> + <newsletter-form></newsletter-form> + </div> +</section> +<div class="content content--box padded padded--v30-hPage padded--desktop-v50-hPage padded--xdesktop-v50-h0"> + <div class="content__section"> + <div class="page-bottom__links"> + <div class="page-bottom__links-column"> + <h3 class="heading heading--title-3">Yksityisille ilmoittajille</h3> + <div class="page-bottom__link-list"> + <a class="paragraph paragraph--caption" target="_self" href="/myy">Tee myynti-ilmoitus</a> + <a class="paragraph paragraph--caption" target="_self" href="/vuokraa">Tee vuokrailmoitus</a> + <a class="paragraph paragraph--caption" target="_self" href="/artikkelit/oppaat/asunnon-myyntiopas-myy-kotisi-hetkessa/">Asuntomyynnin opas</a> + <a class="paragraph paragraph--caption" target="_self" href="/artikkelit/oppaat/vuokratuotto-kattoon-vuokranantajan-opas/">Vuokranantajan opas</a> + <a class="paragraph paragraph--caption" target="_self" href="/valitse-kiinteistonvalittaja">Valitse välittäjä avuksi</a> + <a class="paragraph paragraph--caption" target="_self" href="/luo-ilmoitus">Hinnasto</a> + </div> + </div> + <div class="page-bottom__links-column"> + <h3 class="heading heading--title-3">Yritysasiakkaille</h3> + <div class="page-bottom__link-list"> + <a class="paragraph paragraph--caption" target="_self" href="/hinnasto">Palvelut ja hinnasto</a> + <a class="paragraph paragraph--caption" target="_self" href="/sopimukset">Sopimukset</a> + <a class="paragraph paragraph--caption" target="_self" href="/ilmoitustakuu">Ilmoitustakuu</a> + <a class="paragraph paragraph--caption" target="_self" href="/kiinteistonvalitysjarjestelma">Kiinteistönvälitysjärjestelmä</a> + <a class="paragraph paragraph--caption" target="_self" href="/pdx-constructor">Rakennusliikkeet</a> + <a class="paragraph paragraph--caption" target="_blank" rel="noopener nofollow" href="https://tuki.oikotie.fi/">Ota yhteyttä</a> + </div> + </div> + <div class="page-bottom__links-column"> + <h3 class="heading heading--title-3">Asunnon etsijöille</h3> + <div class="page-bottom__link-list"> + <a class="paragraph paragraph--caption" target="_self" href="https://asunnot.oikotie.fi/myytavat-asunnot?show-guard-tour=1&show-guard-tour-again=1">Tee hakuvahti</a> + <a class="paragraph paragraph--caption" target="_self" href="/yritys">Hae välittäjätoimistoja</a> + </div> + </div> + </div> + </div> +</div> +</div> + <footer class="footer hidden-embedded"> + <div class="content content--border-top padded padded--v0-hPage footer__content"> + <div class="content__section footer__content-section"> + <div class="footer__content-row"> + <div class="footer__content-col-left footer__logo"> + <a class="link" + analytics-click="footer_logo" + href="https://asunnot.oikotie.fi" + target="_self"> + <img width="121" height="32" + src="https://cdn.asunnot.oikotie.fi/images/oikotie-logo-black.svg" + alt="Oikotie logo"> + </a> + </div> + <div class="footer__content-col-right footer__links"> + <div class="footer__link-column"> + <h4 class="heading heading--title-4">Yrityksille</h4> + <div class="footer__link-list"> + <a class="link link--text-only footer__links--link" + analytics-click="footer_bottomLink" + analytics-click-data="{'label':'news'}" + href="https://asunnot.oikotie.fi/hinnasto/tavoita-kohdennetusti" + target="_blank" rel="noopener"> + <span class="link__text">Uutiset & Media</span> + </a> + <a class="link link--text-only footer__links--link" + analytics-click="footer_bottomLink" + analytics-click-data="{'label':'sale-conditions'}" + href="https://www.tori.fi/yrityksille/gdpr-ja-yleiset-sopimusehdot" + target="_blank" rel="noopener"> + <span class="link__text">Yleiset myyntiehdot</span> + </a> + </div> + </div> + <div class="footer__link-column"> + <h4 class="heading heading--title-4">Oikotie</h4> + <div class="footer__link-list"> + <a class="link link--text-only footer__links--link" + analytics-click="footer_bottomLink" + analytics-click-data="{'label':'oikotie-asunnot'}" + href="https://asunnot.oikotie.fi" + target="_blank" rel="noopener"> + <span class="link__text">Oikotie Asunnot</span> + </a> + <a class="link link--text-only footer__links--link" + analytics-click="footer_bottomLink" + analytics-click-data="{'label':'oikotie-toimitilat'}" + href="https://toimitilat.oikotie.fi" + target="_blank" rel="noopener"> + <span class="link__text">Oikotie Toimitilat</span> + </a> + <a class="link link--text-only footer__links--link" + analytics-click="footer_bottomLink" + analytics-click-data="{'label':'oikotie-vend'}" + href="https://asunnot.oikotie.fi/artikkelit/asuminen/vend/" + target="_blank" rel="noopener"> + <span class="link__text">Tietoa Vendistä</span> + </a> + </div> + </div> + <div class="footer__link-column"> + <h4 class="heading heading--title-4">Tietosuoja</h4> + <div class="footer__link-list"> + <cookie-settings [privacy-manager-id]="1161795"></cookie-settings> + <a class="link link--text-only footer__links--link" + analytics-click="footer_bottomLink" + analytics-click-data="{'label':'behavioral-ads'}" + href="https://www.youronlinechoices.com/fi/" + target="_blank" rel="noopener"> + <span class="link__text">Käyttäytymiseen perustuva mainonta</span> + </a> + <footer-privacy-settings base-uri="https://privacysettings.vend.fi/?client_id=6322eb3b9dddad507226afac&referrer=https://asunnot.oikotie.fi/&utm_source=oikotie&utm_medium=footer" + link-text="Yksityisyysasetukset"></footer-privacy-settings> + <a class="link link--text-only footer__links--link" + analytics-click="footer_bottomLink" + analytics-click-data="{'label':'data-protection'}" + href="https://vend.com/privacy/fi-policy" + target="_blank" rel="noopener"> + <span class="link__text">Tietosuojakäytäntö</span> + </a> + </div> + </div> + <div class="footer__link-column"> + <h4 class="heading heading--title-4">Tuki</h4> + <div class="footer__link-list"> + <a class="link link--text-only footer__links--link" + analytics-click="footer_bottomLink" + analytics-click-data="{'label':'feedback'}" + href="https://tuki.oikotie.fi/" + target="_blank" rel="noopener"> + <span class="link__text">Asiakaspalvelu</span> + </a> + <a class="link link--text-only footer__links--link" + analytics-click="footer_bottomLink" + analytics-click-data="{'label':'eula'}" + href="https://www.oikotie.fi/kayttoehdot/" + target="_blank" rel="noopener"> + <span class="link__text">Käyttöehdot</span> + </a> + </div> + </div> + </div> + </div> + <hr class="margined margined--v30"> + <div class="footer__content-row"> + <div class="footer__content-col-left"> + <div class="some-links"> + <ul class="some-links__list"> + <li class="some-links__list-item"> + <a target="_blank" rel="nofollow noopener" title="Seuraa Facebookissa" + href="https://fi-fi.facebook.com/oikotieasunnot" + class="link link--has-icon social-media-link "> + <i class="link__icon social-media-link__icon icon icon--facebook" + role="img" aria-label="Seuraa Facebookissa"></i> + </a> + </li> + <li class="some-links__list-item"> + <a target="_blank" rel="nofollow noopener" title="Seuraa Twitterissä" + href="https://x.com/OikotieAsunnot" + class="link link--has-icon social-media-link "> + <i class="link__icon social-media-link__icon icon icon--twitter" + role="img" aria-label="Seuraa Twitterissä"></i> + </a> + </li> + <li class="some-links__list-item"> + <a target="_blank" rel="nofollow noopener" title="Seuraa Instagramissa" + href="https://instagram.com/oikotieasunnot/" + class="link link--has-icon social-media-link "> + <i class="link__icon social-media-link__icon icon icon--instagram" + role="img" aria-label="Seuraa Instagramissa"></i> + </a> + </li> + </ul> +</div> + </div> + <div class="footer__content-col-right footer__content-copyright"> + <p>Sisältö on suojattu tekijänoikeuslailla. Säännöllinen, järjestelmällinen tai jatkuva tietojen kerääminen, tallentaminen, indeksointi, jakelu tai muu tietojen kokoaminen ei ole sallittua ilman Oikotien antamaa kirjallista lupaa.</p> + <p class="paragraph--marginless">©1999–2025 Oikotie</p> + </div> + </div> + </div> + </div> + <div class="content content--border-top padded padded--v10-hPage footer__see-also"> + <div class="content__section"> + <div class="footer__content-row"> + <div class="footer__content-col-left"> + </div> + <div class="footer__content-col-right"> + <ul class="unordered-list footer__see-also--unordered-list"> + <li class="hide-mobile">Tutustu myös:</li> + <li class="unordered-list__entry unordered-list__entry--first"> + <a class="link link--first" + analytics-click="footer_seeAlso" + analytics-click-data="{'label':'autovex'}" + href="https://autovex.fi/" + target="_blank" rel="noopener"> + <span class="link__text">AutoVex</span> + </a> + </li> + <li class="unordered-list__entry "> + <a class="link " + analytics-click="footer_seeAlso" + analytics-click-data="{'label':'hintaopas'}" + href="https://hintaopas.fi/" + target="_blank" rel="noopener"> + <span class="link__text">Hintaopas</span> + </a> + </li> + <li class="unordered-list__entry "> + <a class="link " + analytics-click="footer_seeAlso" + analytics-click-data="{'label':'hygglo'}" + href="https://www.hygglo.fi/" + target="_blank" rel="noopener"> + <span class="link__text">Hygglo</span> + </a> + </li> + <li class="unordered-list__entry "> + <a class="link " + analytics-click="footer_seeAlso" + analytics-click-data="{'label':'qasa'}" + href="https://qasa.fi/fi" + target="_blank" rel="noopener"> + <span class="link__text">Qasa</span> + </a> + </li> + <li class="unordered-list__entry "> + <a class="link " + analytics-click="footer_seeAlso" + analytics-click-data="{'label':'tori'}" + href="https://www.tori.fi/" + target="_blank" rel="noopener"> + <span class="link__text">Tori</span> + </a> + </li> + </ul> + </div> + </div> + </div> + </div> +</footer> + <footer-data-controller></footer-data-controller> + <script src="/lib/js/jquery/jquery-1.12.4.min.js"></script> +<script src="https://cdn.asunnot.oikotie.fi/js/vendor.042c3e4c.js"></script> + + <script src="https://cdn.asunnot.oikotie.fi/js/listing-scripts.f3f4df55.js"></script> + + + +<script type="text/ng-template" id="/template/oikotie-app/popup"> +<div class="oikotie-app-popup oikotie-app-popup--hidden" + on-background-click="$ctrl.hide()" + ng-attr-aria-hidden="{{(!$ctrl.isApple && !$ctrl.isAndroid) ? 'true' : 'false'}}" + ng-class="{'oikotie-app-popup--hidden': $ctrl.hidden}"> + <div class="oikotie-app-popup__header margined margined--v15"> + <img class="oikotie-app-popup__logo" src="https://cdn.asunnot.oikotie.fi/images/oikotie-app/app-logo.png" + loading="lazy" alt="" width="43" height="44"> + <h4 class="heading heading--title-4">Lataa ilmainen Oikotie-sovellus</h4> + </div> + <ul class="product-list product-list--small margined margined--v20"> + <li class="product-list__entry"> + <i class="product-list__icon icon icon--check" aria-hidden="true"></i> + <span>Tallenna kohde suosikiksi</span> + </li> + <li class="product-list__entry"> + <i class="product-list__icon icon icon--check" aria-hidden="true"></i> + <span>Push-notifikaatiolla tieto uusista kohteista</span> + </li> + <li class="product-list__entry"> + <i class="product-list__icon icon icon--check" aria-hidden="true"></i> + <span>Selkeä haku ja karttapalvelu</span> + </li> + </ul> + <a class="oikotie-app-popup__link" + ng-href="{{$ctrl.ctaUrl}}" + aria-label="Lataa sovellus" + target="_blank" + rel="nofollow noopener" + analytics-click="app-popup_cta-click" + analytics-click-meta="{{$ctrl.isApple ? 'apple' : 'android'}}"> + <img ng-if="$ctrl.isApple" src="https://cdn.asunnot.oikotie.fi/images/oikotie-app/app-store.png" loading="lazy" alt="" width="149" height="44"> + <img ng-if="$ctrl.isAndroid" src="https://cdn.asunnot.oikotie.fi/images/oikotie-app/google-play.png" loading="lazy" alt="" width="148" height="44"> + </a> + <button class="button button--no-styling oikotie-app-popup__close" + aria-label="Sulje Oikotie-sovelluksen mainos" + ng-click="$ctrl.hide()" + analytics-click="app-popup_close" + analytics-click-meta="{{$ctrl.isApple ? 'apple' : 'android'}}"> + <i class="icon icon--close"></i> + </button> +</div> +</script> + + +<script type="text/ng-template" id="/template/card/card"> +<a ng-href="{{$ctrl.disableLink ? null : $ctrl.card.url}}" + ng-attr-target="{{::$ctrl.embedded ? '_blank' : '_self'}}" + analytics-click="{{::$ctrl.otasEvent}}" + analytics-click-position="{{$ctrl.index + 1}}" + analytics-click-extra-visibility="{{::$ctrl.card.hasExtraVisibility}}" + class="link link--muted ot-card" + data-card-type="{{$ctrl.card.type}}"> + <div class="ot-card__header"> + <div class="ot-card__address"> + <div class="ot-card__street" ng-bind="$ctrl.card.building.address"></div> + <div class="ot-card__text"> + <span class="ot-card__text" ng-if="$ctrl.card.building.district" ng-bind="$ctrl.card.building.district"></span><span + class="ot-card__text ot-card__text--concat" + ng-if="$ctrl.card.building.city" + ng-bind="$ctrl.card.building.city"></span> + </div> + </div> + <div class="ot-card__favourite hidden-embedded" ng-if="::!$ctrl.showSettings"> + <favourite-icon [card-id]="{{$ctrl.card.id}}" [inverted]="ctrl.card.hasExtraVisibility"></favourite-icon> + </div> + <button ng-click="$ctrl.settingsClick($event)" aria-label="Asetukset" class="ot-card__settings icon-highlight" ng-if="::$ctrl.showSettings"> + <i class="button__icon icon icon--settings"></i> + </button> + </div> + <div class="ot-card__image-wrapper"> + <picture class="ot-card__image"> + <source type="image/webp" ng-attr-srcset="{{$ctrl.card.image.smallWebP + ', ' + $ctrl.card.image.smallWebPx2 + ' 2x'}}" media="(min-width:64em)"> + <source type="image/jpeg" ng-attr-srcset="{{$ctrl.card.image.smallJPEG + ', ' + $ctrl.card.image.smallJPEGx2 + ' 2x'}}" media="(min-width:64em)"> + <source type="image/webp" ng-attr-srcset="{{$ctrl.card.image.xlWebP}}" media="(min-width:50em)"> + <source type="image/jpeg" ng-attr-srcset="{{$ctrl.card.image.xlJPEG}}" media="(min-width:50em)"> + <source type="image/webp" ng-attr-srcset="{{$ctrl.card.image.largeWebP + ', ' + $ctrl.card.image.largeWebPx2 + ' 2x'}}" media="(min-width:48em)"> + <source type="image/jpeg" ng-attr-srcset="{{$ctrl.card.image.largeJPEG + ', ' + $ctrl.card.image.largeJPEGx2 + ' 2x'}}" media="(min-width:48em)"> + <source type="image/webp" ng-attr-srcset="{{$ctrl.card.image.xlWebP}}" media="(min-width:22.75em)"> + <source type="image/jpeg" ng-attr-srcset="{{$ctrl.card.image.xlJPEG}}" media="(min-width:22.75em)"> + <source type="image/webp" ng-attr-srcset="{{$ctrl.card.image.mediumWebP}}"> + <source type="image/jpeg" ng-attr-srcset="{{$ctrl.card.image.mediumJPEG}}"> + <img loading="lazy" ng-src="{{$ctrl.card.image.smallJPEG}}" alt="Kohdekuva"> + </picture> + + <div class="ot-card__info-tag-wrapper ot-card__info-tag-wrapper--top"> + <div ng-if="$ctrl.card.nextViewing && $ctrl.card.nextViewing.period !== 'past'" class="ot-card__info-tag"> + <span ng-if="$ctrl.card.nextViewing.first">Ensiesittely:</span> + <span ng-if="!$ctrl.card.nextViewing.first">Esittely:</span> + <span ng-switch="$ctrl.card.nextViewing.period"> + <span ng-switch-when="now">Nyt</span> + <span ng-switch-when="today">Tänään <span ng-bind="$ctrl.card.nextViewing.startTime"></span></span> + <span ng-switch-when="tomorrow">Huomenna</span> + <span ng-switch-default ng-bind="$ctrl.card.nextViewing.date | date:'d.M.'"></span> + </span> + </div> + <div ng-if="$ctrl.card.nextViewing && $ctrl.card.nextViewing.live" class="ot-card__info-tag ot-card__info-tag--live-viewing"> + Live-esittely + </div> + <div ng-if="$ctrl.card.isOnlineOffer" class="ot-card__info-tag">Tarjouskauppa</div> + <div ng-if="$ctrl.card.isPresale" class="ot-card__info-tag">Tulossa myyntiin</div> + </div> + <div class="ot-card__info-tag-wrapper ot-card__info-tag-wrapper--bottom"> + <div ng-if="$ctrl.card.isRecent && $ctrl.card.status != 64" class="ot-card__info-tag ot-card__info-tag--recent">Uusi</div> + <div ng-if="$ctrl.card.sellStatus === 4 && $ctrl.card.sourceType === 1" class="ot-card__info-tag ot-card__info-tag--tori">Tuotu Torista</div> + + <div ng-switch="$ctrl.card.status"> + + <span class="ot-card__info-tag ot-card__info-tag--deleted" ng-switch-when="2">Poistunut</span> + <span class="ot-card__info-tag ot-card__info-tag--new" ng-switch-when="64">Luonnos</span> + <span class="ot-card__info-tag ot-card__info-tag--disabled" ng-switch-when="4">Lepotilassa</span> + + </div> + <div ng-if="$ctrl.card.priceChanged" class="ot-card__info-tag ot-card__info-tag--price-changed">Hinta muuttunut</div> + </div> + <img ng-if="$ctrl.card.brand.image" loading="lazy" ng-src="{{$ctrl.card.brand.image}}" class="ot-card__img-brand" alt="Yrityslogo" /> + </div> + <div class="ot-card__body"> + <section class="ot-card__text ot-card__price-size ot-card__section"> + <span class="ot-card__text ot-card__price" ng-bind="$ctrl.card.price"></span> + <span class="ot-card__text ot-card__price" ng-if="!$ctrl.card.price">Kysy hintaa</span> + <span class="ot-card__text ot-card__size" ng-if="$ctrl.card.size" ng-bind="$ctrl.card.size"></span> + <span class="ot-card__text ot-card__size ot-card__size--wide" ng-if="$ctrl.card.sizeFlexible" ng-bind="$ctrl.card.sizeFlexible"></span> + </section> + <section class="ot-card__section" ng-if="$ctrl.card.roomConfiguration"> + <div class="ot-card__text" ng-bind="$ctrl.card.roomConfiguration"></div> + </section> + <section ng-if="$ctrl.card.subType || $ctrl.card.building.year" class="ot-card__section"> + + <span class="ot-card__text ot-card__new-development" + ng-if="$ctrl.card.isNewDevelopment">Uudiskohde:</span><!-- + --><span class="ot-card__text" + ng-if="$ctrl.card.subType" + translate="{{$ctrl.card.subTypeConstant}}"></span><!-- + --><span class="ot-card__text ot-card__text--concat" + ng-if="$ctrl.card.building.year" + ng-bind="$ctrl.card.building.year"></span> + </section> + </div> +</a> +</script> + + +<script type="text/ng-template" id="/template/result-browse/search-results"> +<div ng-if="::$ctrl.visible" class="result-browse"> + <a rel="prev" + target="_self" + class="button button--text button--icon-only-on-medium" + analytics-click="nav_result_browse" + analytics-click-label="prev" + ng-if="$ctrl.hasPrevious" + ng-href="{{$ctrl.previous.url}}"><i + class="button__icon icon icon--chevron-left"></i><span class="button__text">Edellinen</span></a> + <span ng-if="$ctrl.posText" ng-bind="$ctrl.posText"></span> + <a analytics-click="nav_result_browse" + analytics-click-label="next" + target="_self" + rel="next" class="button button--text button--icon-only-on-medium" + ng-if="$ctrl.hasNext" + ng-href="{{$ctrl.next.url}}"><span class="button__text">Seuraava</span><i + class="button__icon icon icon--chevron-right"></i></a> +</div> +</script> + +</body> +</html> |
