from otree.api import * import random import itertools import json doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'demographics_energy' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): # Onboarding evaluation = models.StringField( label="Ich habe die Informationen gelesen und verstanden und bin mit der beschriebenen Nutzung der Daten einverstanden.", choices=["Ja", "Nein"], widget=widgets.RadioSelect, blank=True ) # Demographic Variables age = models.IntegerField(label="Wie alt sind Sie?", min=16, max=110) gender = models.StringField( choices=[ ['männlich', 'Männlich'], ['weiblich', 'Weiblich'], ['anderes', 'Anderes'], ['nothing', 'Nothing'], ], label="Mit welchem Geschlecht identifizieren Sie sich?", widget=widgets.RadioSelect ) gender_other = models.StringField( blank=True, label="Bitte geben Sie Ihr Geschlecht an." ) income = models.StringField( choices=[ ["0_999", "0 - 999€"], ["1000_1999", "1000 - 1999€"], ["2000_2999", "2000 - 2999€"], ["3000_3999", "3000 - 3999€"], ["4000_4999", "4000 - 4999€"], ["5000", "Mehr als 5000€"] ], label="Bitte geben Sie ihr monatliches Nettohaushaltseinkommen an.", widget=widgets.RadioSelect ) state = models.StringField( choices=[ "Baden-Württemberg", "Bayern", "Berlin", "Brandenburg", "Bremen", "Hamburg", "Hessen", "Mecklenburg-Vorpommern", "Niedersachsen", "Nordrhein-Westfalen", "Rheinland-Pfalz", "Saarland", "Sachsen", "Sachsen-Anhalt", "Schleswig-Holstein", "Thüringen" ], label="In welchem Bundesland wohnen Sie?", widget=widgets.RadioSelect ) living_area = models.StringField( choices=[ ["big_city", "einer Großstadt (mehr als 100.000 Einwohner)"], ["middle_city", "einer Mittelstadt (20.000 - 100.000 Einwohner)"], ["small_city", "einer Kleinstadt (5.000 - 20.000 Einwohner)"], ["rural", "einem Dorf/ auf dem Land (weniger als 5.000 Einwohner)"] ], label="Ich lebe in ...", widget=widgets.RadioSelect ) living_situation = models.StringField( choices=[ ["rent", "Ich wohne zur Miete"], ["ownership", "Ich wohne in meinem eigenen Eigentum"], ["rent_free", "Ich wohne in einer Wohnung/ einem Haus, das nicht mir gehört, zahle aber keine Miete (zum Beispiel " "bei den Eltern)"] ], label="Wohnen Sie zur Miete oder in Ihrem eigenen Eigentum?", widget=widgets.RadioSelect ) living_size = models.IntegerField( label="Wie viele Quadratmeter (qm) Wohnfläche haben Sie?", min=1, max=1000 ) household_size = models.IntegerField( label="Wie viele Personen, Sie eingeschlossen, leben dauerhaft in Ihrem Haushalt?", min=1, max=15 ) education = models.StringField( choices=[ ["schule", "Ich gehe noch auf eine allgemeinbildende Schule"], ["keiner", "Ich habe die Schule ohne Abschluss verlassen"], ["haupt", "Hauptschulabschluss oder gleichwertiger Abschluss"], ["real", "Realschulabschluss, Mittlere Reife oder gleichwertiger Abschluss"], ["abitur", "Abitur oder fachgebundene Hochschulreife"], ["ausbildung", "Abgeschlossene Berufsausbildung"], ["studium", "Fachhochschulabschluss/ Universitätsabschluss"] ], label="Was ist der höchste Bildungsgrad, den Sie besitzen?", widget=widgets.RadioSelect ) occupation = models.StringField( choices=[ ["arbeit", "Erwerbstätig"], ["ausbildung", "In beruflicher Ausbildung, Umschulung oder Weiterbildung"], ["studium", "Im Studium"], ["arbeitslos", "Arbeitslos gemeldet"], ["elternzeit", "In Mutterschutz, Elternzeit oder sonstiger Beurlaubung"], ["hausmann", "Hausmann/ -frau"], ["sonstiges", "Sonstiges"] ], label="Was machen Sie derzeit hauptsächlich? Ich bin ...", widget=widgets.RadioSelect ) # Energy Variables energy_cons = models.IntegerField( label="Wie hoch ist Ihr jährlicher Stromverbrauch in Kilowattstunden (kWh)?", blank=True, min=200 ) energy_cons_dk = models.BooleanField( label="Weiß ich nicht", blank=True, initial=False ) energy_price = models.IntegerField( label="Wie viel Cent zahlen Sie in Ihrem aktuellen Stromtarif pro Kilowattstunde (Cent/kWh), inklusive aller Steuern und Abgaben?", blank=True, min=15, max=50 ) energy_price_dk = models.BooleanField( label="Weiß ich nicht", blank=True, initial=False ) device_washing_machine = models.BooleanField(label="Waschmaschine") device_dryer = models.BooleanField(label="Trockner") device_oven = models.BooleanField(label="Elektrischer Ofen") device_tv = models.BooleanField(label="Fernseher") device_ev = models.BooleanField(label="E-Auto und Wallbox") device_heat_pump = models.BooleanField(label="Wärmepumpe") device_computer = models.BooleanField(label="Computer/ Laptop") device_dishwasher = models.BooleanField(label="Spülmaschine") device_microwave = models.BooleanField(label="Mikrowelle") device_water_heater = models.BooleanField(label="Elektrischer Durchlauferhitzer") energy_saving = models.IntegerField( choices=[[1, '1: stimme überhaupt nicht zu'], [2, '2'], [3, '3: Weder noch'], [4, '4'], [5, '5: stimme voll zu']], label="Ich lebe energiesparend und lege hohen Wert auf energieeffiziente Haushaltsgeräte.", widget=widgets.RadioSelectHorizontal ) energy_replacing = models.IntegerField( choices=[[1, '1: stimme überhaupt nicht zu'], [2, '2'], [3, '3: Weder noch'], [4, '4'], [5, '5: stimme voll zu']], label="Ich ersetze regelmäßig energieineffiziente Haushaltsgeräte, um Energie zu sparen, auch wenn die alten Geräte noch funktionsfähig sind.", widget=widgets.RadioSelectHorizontal ) energy_overview = models.IntegerField( choices=[[1, '1: stimme überhaupt nicht zu'], [2, '2'], [3, '3: Weder noch'], [4, '4'], [5, '5: stimme voll zu']], label="Ich habe einen guten Überblick darüber, wie viel Energie mein Haushalt im Monat/ Jahr verbraucht.", widget=widgets.RadioSelectHorizontal ) energy_comparison = models.IntegerField( choices=[[1, '1: stimme überhaupt nicht zu'], [2, '2'], [3, '3: Weder noch'], [4, '4'], [5, '5: stimme voll zu']], label="Ich vergleiche regelmäßig Energietarife unterschiedlicher Anbieter, um möglicherweise einen günstigeren Tarif zu finden.", widget=widgets.RadioSelectHorizontal ) photovoltaic = models.StringField( choices=[ ["ja", "Ja"], ["nein", "Nein"], ], label="Besitzen Sie eine Photovoltaik-Anlage und/ oder einen Batteriespeicher?", widget=widgets.RadioSelect ) battery_storage = models.StringField( choices=[ ["besitz", "Ich besitze einen Batteriespeicher"], ["geplant", "Ich besitze keinen Batteriespeicher, plane aber in der Zukunft auf jeden Fall einen Batteriespeicher anzuschaffen"], ["unsicher", "Ich besitze keinen Batteriespeicher und weiß noch nicht, ob ich in Zukunft einen Batteriespeicher anschaffen werde"], ["ablehnung", "Ich besitze keinen Batteriespeicher und werde in Zukunft auch keinen anschaffen"] ], label="Besitzen Sie einen Batteriespeicher oder planen Sie einen solchen in Zukunft anzuschaffen?", widget=widgets.RadioSelect ) # PAGES # -------- DEMOGRAPHICS -------- class Welcome(Page): form_model = "player" class Evaluation(Page): form_model = "player" form_fields = ["evaluation"] def error_message(self, values): if not values['evaluation'] : return "Sie müssen der beschriebenen Nutzung der Daten zustimmen, um mit der Umfrage fortzufahren." if values['evaluation'] == "Nein": return "Sie müssen der beschriebenen Nutzung der Daten zustimmen, um mit der Umfrage fortzufahren." class Age(Page): form_model = "player" form_fields = ["age"] class Gender(Page): form_model = "player" form_fields = ["gender", "gender_other"] def error_message(self, values): if values['gender'] == "Ich identifiziere mich als:" and not values['gender_custom']: return "Bitte geben Sie an, wie Sie Ihr Geschlecht beschreiben." class Income(Page): form_model = "player" form_fields = ["income"] class State(Page): form_model = "player" form_fields = ["state"] class Living_Area(Page): form_model = "player" form_fields = ["living_area"] class Living_Situation(Page): form_model = "player" form_fields = ["living_situation"] class Living_Size(Page): form_model = "player" form_fields = ["living_size"] def before_next_page(player: Player, timeout_happened): player.participant.vars['living_size'] = player.living_size class Household_Size(Page): form_model = "player" form_fields = ["household_size"] def before_next_page(player: Player, timeout_happened): player.participant.vars['household_size'] = player.household_size class Education(Page): form_model = "player" form_fields = ["education"] class Occupation(Page): form_model = "player" form_fields = ["occupation"] # -------- Energy consumption -------- class Electricity(Page): form_model = 'player' form_fields = [ 'energy_cons', 'energy_cons_dk', 'energy_price', 'energy_price_dk', ] def error_message(player, values): errors = {} if not values['energy_cons_dk']: if values['energy_cons'] is None: errors['energy_cons'] = "Bitte geben Sie Ihren Verbrauch an oder wählen Sie 'Weiß ich nicht'." if not values['energy_price_dk']: if values['energy_price'] is None: errors['energy_price'] = "Bitte geben Sie Ihren Preis an oder wählen Sie 'Weiß ich nicht'." return errors or None def before_next_page(player: Player, timeout_happened): if player.energy_cons_dk == False: player.participant.vars['energy_cons'] = player.energy_cons player.participant.vars['energy_cons_dk'] = player.energy_cons_dk else: player.participant.vars['energy_cons_dk'] = player.energy_cons_dk if player.energy_price_dk == False: player.participant.vars['energy_price'] = player.energy_price player.participant.vars['energy_price_dk'] = player.energy_price_dk else: player.participant.vars['energy_price_dk'] = player.energy_price_dk class Devices(Page): form_model = 'player' form_fields = [ 'device_washing_machine', 'device_dryer', 'device_oven', 'device_tv', 'device_ev', 'device_heat_pump', 'device_computer', 'device_dishwasher', 'device_microwave', 'device_water_heater', ] def before_next_page(player: Player, timeout_happened): player.participant.vars['device_washing_machine'] = player.device_washing_machine player.participant.vars['device_dryer'] = player.device_dryer player.participant.vars['device_oven'] = player.device_oven player.participant.vars['device_tv'] = player.device_tv player.participant.vars['device_ev'] = player.device_ev player.participant.vars['device_heat_pump'] = player.device_heat_pump player.participant.vars['device_computer'] = player.device_computer player.participant.vars['device_dishwasher'] = player.device_dishwasher player.participant.vars['device_microwave'] = player.device_microwave player.participant.vars['device_water_heater'] = player.device_water_heater class Consumption(Page): form_model = 'player' @staticmethod def get_form_fields(player: Player): form_fields = ['energy_saving', 'energy_overview', 'energy_comparison'] random.shuffle(form_fields) return form_fields class PV_Battery(Page): form_model = "player" form_fields = ["photovoltaic"] page_sequence = [Evaluation, Age, Gender, Income, State, Living_Area, Living_Situation, Living_Size, Household_Size, Education, Occupation, Electricity, Devices, Consumption, PV_Battery,]# Res_Intro, Res_Knowledge, Res_Strategies, Res_Comprehension, Beliefs] # Grouping options: # Demo1: Age, Gender, Income, Education, Occupation # Demo2: State, Living_Area, Living_Situation, Living_Size, Household_Size # Demo3: Electricity, Devices, Consumption, PV_Battery #page_sequence = [Welcome]