From 92dee13a268f8bea6a23f6d57b6ef42c540adb07 Mon Sep 17 00:00:00 2001 From: Mirko Calcaterra Date: Sun, 13 Oct 2024 23:57:36 +0200 Subject: [PATCH] scoreboard mostly completed --- ...ANT'ANNA MESSI Vs CSI CLAI IMOLA - 0-0.dvw | 160 ++++++++++++++++++ Scoreboard/VolleyballScoreboardServer.py | 118 ++++++++----- Scoreboard/templates/scoreboard.html | 69 ++++---- 3 files changed, 263 insertions(+), 84 deletions(-) create mode 100644 Scoreboard/AKADEMIA SANT'ANNA MESSI Vs CSI CLAI IMOLA - 0-0.dvw diff --git a/Scoreboard/AKADEMIA SANT'ANNA MESSI Vs CSI CLAI IMOLA - 0-0.dvw b/Scoreboard/AKADEMIA SANT'ANNA MESSI Vs CSI CLAI IMOLA - 0-0.dvw new file mode 100644 index 0000000..3f1d4f4 --- /dev/null +++ b/Scoreboard/AKADEMIA SANT'ANNA MESSI Vs CSI CLAI IMOLA - 0-0.dvw @@ -0,0 +1,160 @@ +[3DATAVOLLEYSCOUT] +FILEFORMAT: 2.0 +GENERATOR-DAY: 13/10/2024 23.32.21 +LASTCHANGE-DAY: 13/10/2024 23.32.21 +[3MATCH] +13/10/2024;23.24.00;;amichevole;Andata;Interno;0;0;1;1;Z;0; +;;45578;;;; +[3TEAMS] +MES;AKADEMIA SANT'ANNA MESSINA;0;Bonafede Fabio;Ferrara Flavio;16777215; +IMO;CSI CLAI IMOLA;0;Caliendo Nello;Dominico Speek Odelvys;16777215; +[3MORE] + ;0;0;;;; +;0;0; +[3COMMENTS] +no comments;no comments;no comments;no comments; +[3SET] +True;0-0;0-0;0-0;2-3;1; +True;;;;;; +True;;;;;; +True;;;;;; +True;;;;;; +[3PLAYERS-H] +0;1;1;1;;;;;CAB-LIN-04;Cabassa;Linda;;;2;False;;; +0;2;2;*;;;;;NOR-MAR-98;Norgini;Maria Chiara;;L;1;False;;; +0;3;3;2;;;;;OLI-ROS-91;Olivotto;Rossella;;;4;False;;; +0;4;4;3;;;;;CAR-GIU-94;Carraro;Giulia;;;5;False;;; +0;5;5;4;;;;;MOD-DAL-98;Modestino;Dalila;;;2;False;;; +0;9;6;5;;;;;ROL-ADA-99;Rollins;Adanna;;;4;False;;; +0;10;7;6;;;;;ROS-AUR-97;Rossetto;Aurora;;;3;False;;; +0;11;8;;;;;;MAS-CHI-00;Mason;Chiara;;;2;False;;; +0;13;9;;;;;;TRE-AMB-92;Trevisiol;Ambra;;;5;False;;; +0;14;10;;;;;;CAF-GIO-94;Caforio;Giorgia;;L;1;False;;; +0;16;11;;;;;;BAB-MAR-98;Babatunde;Maria Adelaide;;;4;False;;; +0;17;12;;;;;;GUZ-BIB-04;Guzin;Bibiana;;;4;False;;; +0;18;13;*;;;;;DIO-BIN-02;Diop;Binto;;;3;False;;; +[3PLAYERS-V] +1;1;14;1;;;;;POM-VAL-94;Pomili;Valentina;;;2;False;;; +1;3;15;2;;;;;BAC-BEA-03;Bacchilega;Beatrice;;;4;False;;; +1;4;16;3;;;;;PIN-MAT-04;Pinarello;Matilde;;;5;False;;; +1;5;17;4;;;;;CAV-SOF-98;Cavalli;Sofia;;;2;False;;; +1;6;18;5;;;;;MES-IRE-06;Mescoli;Irene;;;4;False;;; +1;7;19;6;;;;;RAV-EVA-99;Ravazzolo;Eva;;;3;False;;; +1;8;20;;;;;;ARC-CHI-08;Arcangeli;Chiara;;;4;False;;; +1;9;21;;;;;;MIG-SOF-01;Migliorini;Sofia;;;4;False;;; +1;10;22;*;;;;;MAX-ALX-91;Mastrilli;Alessia;;L;1;False;;; +1;11;23;;;;;;GAM-ARI-05;Gambini;Arianna;;L;1;False;;; +1;15;24;;;;;;VIS-ARI-06;Visentin;Arianna;;;2;False;;; +1;16;25;;;;;;MES-GLE-99;Messaggi;Glenda;;;3;False;;; +1;18;26;*;;;;;BUL-KAT-02;Bulovic;Katarina;;;2;False;;; +1;27;27;;;;;;STX-SAX-01;Stival;Sara;;;3;False;;; +[3ATTACKCOMBINATION] +X2;2;L;Q;Veloce dietro;;65280;4868;C;; +X1;3;R;Q;Veloce davanti;;65280;4956;C;; +XM;3;C;Q;Veloce in punto 3;;65280;4949;C;; +XG;3;R;Q;7-1 Gun;;65280;4946;C;; +XC;3;R;Q;Veloce spostata;;65280;4947;C;; +XD;3;R;Q;DoppiaC;;65280;4941;C;; +X7;4;R;Q;Sette Davanti;;65280;4932;C;; +XS;2;L;Q;Sette Dietro;;65280;4981;C;; +XO;2;L;Q;Veloce Dietro Opp.;;65280;4973;B;; +XF;2;L;Q;Fast Opposto;;65280;4976;B;; +PP;3;L;O;Pallonetto Alzatore;;16711680;4964;S;; +X9;4;R;M;Mezza davanti dopo 7;;16711680;4924;F;; +XT;4;R;M;Mezza da posto 4 (default 3R);;16711680;4950;F;; +X3;2;L;M;Mezza da posto 2 (default 2L);;16711680;4950;B;; +X4;2;L;M;Mezza dietro C.A.;;16711680;4976;B;; +XQ;2;L;M;Mezza Dietro C.D.;;16711680;4976;B;; +XB;8;C;M;Pipe spostata 6-1;;16711680;4163;P;1; +XP;8;C;M;Pipe;;16711680;4150;P;1; +XR;8;C;M;Pipe spostata 6-5;;16711680;4138;P;1; +X5;4;R;T;Spinta in posto 4;;16711680;4912;F;; +X0;7;C;T;Spinta in posto 5;;16711680;4114;F;1; +X6;2;L;T;Spinta in posto 2;;16711680;4988;B;; +X8;1;L;T;Spinta in posto 1 (default 9C);;16711680;4186;B;1; +CD;2;L;Q;Fast vicino al palleggiatore;;16711680;4970;C;; +CB;2;L;Q;Fast spostata dal palleggiatore;;16711680;4976;C;; +CF;2;L;Q;Fast lontano dal palleggiatore;;16711680;4986;C;; +C5;4;R;U;Super in posto 4;;0;4912;F;; +C0;7;C;U;Super in posto 5;;0;4114;F;1; +C6;2;L;U;Super in posto 2;;0;4988;B;; +C8;9;C;U;Super in posto 1;;0;4186;B;1; +V5;4;R;H;Alta in posto 4;;255;4912;F;; +V0;7;C;H;Alta in posto 5;;255;4114;F;1; +V6;2;L;H;Alta in posto 2;;255;4988;B;; +V8;9;C;H;Alta in posto 1;;255;4186;B;1; +VB;8;C;H;Pipe Alta spostata 6-1;;255;4163;P;1; +VP;8;C;H;Pipe Alta;;255;4150;P;1; +VR;8;C;H;Pipe Alta spostata 6-5;;255;4137;P;1; +V3;3;C;O;Alta in posto 3;;255;4950;-;; +P2;3;C;O;Secondo tocco di là;;255;4949;-;; +PR;3;C;O;Rigore;;255;4949;-;; +[3SETTERCALL] +K1;;Veloce Davanti;;16711680;3949;4454;4958;;; +K2;;Veloce Dietro;;16711680;3864;4278;4974;;; +K7;;Sette;;16711680;3923;4426;4930;;; +KC;;Veloce in punto 3;;16711680;3849;4449;5049;;; +KM;;Spostata in 2;;16711680;0000;0000;0000;4924,5524,5530,6332,6312,5012,5024,;12632256; +KP;;Spostata verso 4;;16711680;0000;0000;0000;5457,5057,5557,5552,6352,6364,5377,5077,5058,5058,;12632256; +KE;;No primo Tempo;;0;0000;0000;0000;5858,5826,6426,6458,6458,;12632256; +KF;;Base Fast;;255;4073;4188;4987;;255; +KU;;Veloce Davanti Spostata in 2-3;;16711680;3965;3965;4877;4924,5524,5530,6332,6312,5012,5024,;255; +KH;;Veloce Davanti Spostata in 4;;16711680;4028;4028;4928;5159,5181,6074,6173,6160,;255; +KB;;Veloce Dietro Spostata in 2;;16711680;3975;4290;4985;4924,5524,5530,6332,6312,5012,5024,;255; +KV;;Sette Spostata in 4;;16711680;3910;4512;4915;5159,5181,6074,6173,6160,;255; +KO;;Su Ricezione - Spostata in 2-1;;16711680;0000;0000;0000;6363,6337,7237,7263,7262,;255; +K4;;Su Ricezione - Spostata in 4-5;;16711680;0000;0000;0000;6363,6337,7237,7263,7262,;255; +KK;;Spostata in 2 Attacco in 3;;16711680;3965;3965;4877;4924,5524,5530,6332,6312,5012,5024,;255; +KD;;Veloce Dietro Spostata in 4;;16711680;3845;4536;4833;5159,5181,6074,6173,6160,;255; +KZ;;Doppia C;;16711680;3687;3560;4929;6249,6229,5023,5050,5050,;255; +[3WINNINGSYMBOLS] +=~~~#~~~=~~~~~~~=/~~#~~~=~~~#~~~=~~~~~~~=~~~~~~~=~~~~~~~ +[3RESERVE] +[3SCOUT] +*P04>LUp;;;;;;;00.00.00;1;3;3;1;0;;;1;3;4;5;9;10;1;3;4;5;6;7; +*z3>LUp;;;;;;;00.00.00;1;3;3;1;0;;;1;3;4;5;9;10;1;3;4;5;6;7; +aP04>LUp;;;;;;;00.00.00;1;3;3;1;0;;;1;3;4;5;9;10;1;3;4;5;6;7; +az3>LUp;;;;;;;00.00.00;1;3;3;1;0;;1;3;4;5;9;10;1;3;4;5;6;7; +a01SM-~~~16;;;;;;;00.00.00;1;3;3;1;0;;1;3;4;5;9;10;1;3;4;5;6;7; +*02RM+~~~16~M2;;;;;;;00.00.00;1;3;3;1;0;;1;3;4;5;9;10;1;3;4;5;6;7; +*04EU#~~~~2;;;;;;;00.00.00;1;3;3;1;0;;1;3;4;5;9;10;1;3;4;5;6;7; +*10AU+C6~15~H2;;r;;4988;-1-1;8574;00.00.06;1;3;3;1;6;;1;3;4;5;9;10;1;3;4;5;6;7; +a04EM#~~~~2;;;;;;;00.00.07;1;3;3;1;7;;1;3;4;5;9;10;1;3;4;5;6;7; +a05AM#XT~41~H2;;p;;4950;-1-1;8319;00.00.09;1;3;3;1;9;;1;3;4;5;9;10;1;3;4;5;6;7; +*$$&H=;p;;;;;;00.00.09;1;3;3;1;9;;1;3;4;5;9;10;1;3;4;5;6;7; +ap00:01;;;;;;;00.00.12;1;3;3;1;12;;1;3;4;5;9;10;1;3;4;5;6;7; +a01SM-~~~16;;;;;;;00.00.13;1;3;3;1;13;;1;3;4;5;9;10;1;3;4;5;6;7; +*02RM+~~~16~M2;;;;;;;00.00.13;1;3;3;1;13;;1;3;4;5;9;10;1;3;4;5;6;7; +*04EU#~~~~2;;;;;;;00.00.13;1;3;3;1;13;;1;3;4;5;9;10;1;3;4;5;6;7; +*05AU#C5~41~H2;;r;;4912;-1-1;941;00.00.18;1;3;3;1;18;;1;3;4;5;9;10;1;3;4;5;6;7; +a$$&H=;s;;;;;;00.00.18;1;3;3;1;18;;1;3;4;5;9;10;1;3;4;5;6;7; +*p01:01;;;;;;;00.00.21;1;3;3;1;21;;1;3;4;5;9;10;1;3;4;5;6;7; +*z2;;;;;;;00.00.21;1;2;3;1;21;;3;4;5;9;10;1;1;3;4;5;6;7; +*03SM-~~~15;;;;;;;00.00.19;1;2;3;1;19;;3;4;5;9;10;1;1;3;4;5;6;7; +a05RM#~~~15~M2;;;;;;;00.00.19;1;2;3;1;19;;3;4;5;9;10;1;1;3;4;5;6;7; +a04EU#~~~~2;;;;;;;00.00.19;1;2;3;1;19;;3;4;5;9;10;1;1;3;4;5;6;7; +a05AU#C5~41~H2;;r;;4912;-1-1;8919;00.00.24;1;2;3;1;24;;3;4;5;9;10;1;1;3;4;5;6;7; +*$$&H=;s;;;;;;00.00.24;1;2;3;1;24;;3;4;5;9;10;1;1;3;4;5;6;7; +ap01:02;;;;;;;00.00.27;1;2;3;1;27;;3;4;5;9;10;1;1;3;4;5;6;7; +*T;;;;;;;00.00.29;1;2;2;1;29;;3;4;5;9;10;1;3;4;5;6;7;1; +az2;;;;;;;00.00.32;1;2;2;1;32;;3;4;5;9;10;1;3;4;5;6;7;1; +a03SM-~~~16;;;;;;;00.00.29;1;2;2;1;29;;3;4;5;9;10;1;3;4;5;6;7;1; +*01RM#~~~16~M2;;;;;;;00.00.29;1;2;2;1;29;;3;4;5;9;10;1;3;4;5;6;7;1; +*04EU#~~~~2;;;;;;;00.00.29;1;2;2;1;29;;3;4;5;9;10;1;3;4;5;6;7;1; +*10AU#C6~15~H2;;r;;4988;-1-1;8671;00.00.34;1;2;2;1;34;;3;4;5;9;10;1;3;4;5;6;7;1; +a$$&H=;s;;;;;;00.00.34;1;2;2;1;34;;3;4;5;9;10;1;3;4;5;6;7;1; +*p02:02;;;;;;;00.00.37;1;2;2;1;37;;3;4;5;9;10;1;3;4;5;6;7;1; +*P4;;;;;;;00.00.49;1;1;2;1;49;;4;5;9;10;1;3;3;4;5;6;7;1; +*z1;;;;;;;00.00.49;1;1;2;1;49;;4;5;9;10;1;3;3;4;5;6;7;1; +*c03:18;;;;;;;00.00.49;1;1;2;1;49;;4;5;9;10;1;3;3;4;5;6;7;1; +*z1;;;;;;;00.00.52;1;1;2;1;52;;4;5;9;10;1;18;3;4;5;6;7;1; +*04SM-~~~16;;;;;;;00.00.53;1;1;2;1;53;;4;5;9;10;1;18;3;4;5;6;7;1; +a01RM#~~~16~M2;;;;;;;00.00.53;1;1;2;1;53;;4;5;9;10;1;18;3;4;5;6;7;1; +a04ET#~~~~2;;;;;;;00.00.53;1;1;2;1;53;;4;5;9;10;1;18;3;4;5;6;7;1; +a05AT#X5~45~H2;;r;;4912;-1-1;8472;00.00.59;1;1;2;1;59;;4;5;9;10;1;18;3;4;5;6;7;1; +*$$&H=;;;;;;;00.00.59;1;1;2;1;59;;4;5;9;10;1;18;3;4;5;6;7;1; +ap02:03;;;;;;;00.01.02;1;1;2;1;62;;4;5;9;10;1;18;3;4;5;6;7;1; +aP4;;;;;;;00.01.08;1;1;1;1;0;;4;5;9;10;1;18;4;5;6;7;1;3; +az1;;;;;;;00.01.08;1;1;1;1;0;;4;5;9;10;1;18;4;5;6;7;1;3; +ac07:18;;;;;;;00.01.08;1;1;1;1;68;;4;5;9;10;1;18;4;5;6;7;1;3; +**1set;;;;;;;00.01.08;1;1;1;1;68;;;;;;;;;;;;;; diff --git a/Scoreboard/VolleyballScoreboardServer.py b/Scoreboard/VolleyballScoreboardServer.py index 38848ba..45429d6 100644 --- a/Scoreboard/VolleyballScoreboardServer.py +++ b/Scoreboard/VolleyballScoreboardServer.py @@ -10,6 +10,7 @@ # Assign path for DataVolley files dvw_path_folder = "C:/Users/mirko/OneDrive - Politecnico di Milano/Altro/Volley/Conco2425/Olbia/" +#dvw_path_folder = "C:/Users/mirko/Documents/GitHub/CuneoWebsite.io/Scoreboard" file_extension = ".dvw" # Get a list of all files with the specified extension in the directory @@ -29,22 +30,31 @@ def process_file(path): print(f"Processing file: {file_name}") # Debugging line combined_df = pd.concat([combined_df, process_file(file_name)], ignore_index=True) -# Summarize volleyball set and return data for rendering def summarize_volleyball_set(plays): - teams = plays['team'].dropna().unique() + teams = plays['team'].dropna().unique() # Get the team names + home_team = plays['home_team'].iloc[0] # Home team name + away_team = plays['visiting_team'].iloc[0] # Away team name + summary_data = [] - set_scores = {} # To keep track of set scores and winners + set_scores = [] # To keep track of set scores and winners + current_set = 1 # Start with set 1 + + # Variables to store current set stats + current_timeouts = {'home': 0, 'away': 0} + current_substitutions = {'home': 0, 'away': 0} + current_video_checks = {'home': 0, 'away': 0} + + home_set_wins = 0 + away_set_wins = 0 def calculate_player_points(team): team_plays = plays[plays['team'] == team] player_points = {} for _, row in team_plays.iterrows(): - # Include 'Block' in addition to 'Attack' and 'Serve' if row['skill'] in ['Attack', 'Serve', 'Block'] and row['evaluation_code'] == '#': player = row['player_name'] if player not in player_points: player_points[player] = {'Attack': 0, 'Serve': 0, 'Block': 0} - # Increment the appropriate skill (Attack, Serve, or Block) player_points[player][row['skill']] += 1 return player_points @@ -54,68 +64,88 @@ def get_team_summary(team): team_total = 0 for player, points in player_points.items(): - total_points = points['Attack'] + points['Serve'] + points['Block'] # Include Block in total + total_points = points['Attack'] + points['Serve'] + points['Block'] team_summary['players'].append({ 'player_name': player, 'total_points': total_points, 'attack_points': points['Attack'], 'serve_points': points['Serve'], - 'block_points': points['Block'], # Include Block points + 'block_points': points['Block'] }) team_total += total_points team_summary['team_total'] = team_total return team_summary - # Count timeouts, substitutions, and video checks - timeouts_called = len(plays[plays['code'].str.contains('TO', na=False)]) - substitutions_done = len(plays[plays['code'].str.contains('SUB', na=False)]) - video_checks_called = len(plays[plays['code'].str.contains('VC', na=False)]) - - # Identify set results from the code column for index, row in plays.iterrows(): - # Check if the code contains "set" (indicating a set completion) - if re.match(r'^\d+set$', row['code']): - set_number = int(row['code'][0]) # Extract the number before 'set' - winning_team = row['team'] - print(winning_team) - - # Look for the previous row to extract the score - if index > 0: - prev_row = plays.iloc[index - 1] - if '*p' in prev_row['code']: - score_str = prev_row['code'] - # Extract scores - scores = score_str.split(':')[1] # "25:20" => "20" - home_score, away_score = map(int, scores.split(':')) - # Store set score results - set_scores[set_number] = { - 'winning_team': winning_team, - 'score': f"{home_score}-{away_score}" - } - - # Get the last completed set number - last_set_number = max(set_scores.keys(), default=0) + # Handle missing values using pd.isna + home_score = 0 if pd.isna(row['home_team_score']) else row['home_team_score'] + away_score = 0 if pd.isna(row['visiting_team_score']) else row['visiting_team_score'] + + # If either team reaches 25 or more points + if home_score >= 25 or away_score >= 25: + # Check if the next row has a reset to 0 (set end) + if index + 1 < len(plays): + next_row = plays.iloc[index + 1] + next_home_score = 0 if pd.isna(next_row['home_team_score']) else next_row['home_team_score'] + next_away_score = 0 if pd.isna(next_row['visiting_team_score']) else next_row['visiting_team_score'] + + if next_home_score == 0 or next_away_score == 0: + # The set is complete + set_result = f"{home_score} - {away_score}" + set_scores.append(set_result) + + # Increment set count for the winning team + if home_score > away_score: + home_set_wins += 1 + else: + away_set_wins += 1 + + current_set += 1 # Increment the set number + + # Reset the stats for the next set + current_timeouts = {'home': 0, 'away': 0} + current_substitutions = {'home': 0, 'away': 0} + current_video_checks = {'home': 0, 'away': 0} + + # Track stats for the current set + if row['code'].startswith('*T'): # Home timeout + current_timeouts['home'] += 1 + elif row['code'].startswith('aT'): # Away timeout + current_timeouts['away'] += 1 + elif 'VC' in row['code']: # Video check + if row['team'] == plays['home_team'].iloc[0]: + current_video_checks['home'] += 1 + else: + current_video_checks['away'] += 1 + if row['code'].startswith('*c'): # Home timeout + current_substitutions['home'] += 1 + elif row['code'].startswith('ac'): # Away timeout + current_substitutions['away'] += 1 # Get last non-NaN score for home and away team - home_score = plays['home_team_score'].dropna().tail(1).values[0] if not plays['home_team_score'].dropna().empty else 0 - away_score = plays['visiting_team_score'].dropna().tail(1).values[0] if not plays['visiting_team_score'].dropna().empty else 0 + final_home_score = plays['home_team_score'].dropna().tail(1).values[0] if not plays['home_team_score'].dropna().empty else 0 + print(final_home_score) + final_away_score = plays['visiting_team_score'].dropna().tail(1).values[0] if not plays['visiting_team_score'].dropna().empty else 0 for team in teams: summary_data.append(get_team_summary(team)) - # Include set scores and other details in the summary + # Include current set, past set scores, and stats for the dashboard summary_data.append({ - 'set_score': f"{home_score} - {away_score}", # Match score - 'last_set_number': last_set_number, # Last set number played - 'timeouts_called': timeouts_called, - 'substitutions_done': substitutions_done, - 'video_checks_called': video_checks_called, - 'set_scores': set_scores # Store all set scores + 'current_set': current_set, + 'team_set_wins': f"{home_team}: {home_set_wins} - {away_set_wins} {away_team}", # Set wins string + 'timeouts': current_timeouts, + 'substitutions': current_substitutions, + 'video_checks': current_video_checks, + 'past_set_scores': set_scores, + 'set_score': f"{final_home_score} - {final_away_score}" }) return summary_data + + def print_team_summary(team_summary): print(f"\n{team_summary['team_name']} Team:") for player in team_summary['players']: diff --git a/Scoreboard/templates/scoreboard.html b/Scoreboard/templates/scoreboard.html index c3919e1..135199a 100644 --- a/Scoreboard/templates/scoreboard.html +++ b/Scoreboard/templates/scoreboard.html @@ -38,70 +38,59 @@ background-color: #e9ecef; } - .player { - margin: 5px 0; - padding: 5px; - border: 1px solid #007bff; - border-radius: 4px; - background-color: #fff; - } - - .total { - font-weight: bold; - color: #007bff; - margin-top: 10px; + .set-info { + margin-top: 20px; + font-size: 1.5em; + text-align: center; + color: #6c757d; } .set-score { + font-size: 3em; /* Larger font size for visibility */ + color: #28a745; /* Green color for scores */ text-align: center; - font-size: 2.5em; /* Increased font size for better visibility */ margin: 20px 0; - color: #28a745; } - .sets-played, .timeouts, .substitutions, .video-checks { + .past-sets { text-align: center; - font-size: 1.5em; /* Increased font size for better visibility */ - margin: 10px 0; - color: #6c757d; - } - - .stats { margin-top: 20px; - text-align: center; } - .set-results { - margin-top: 20px; - text-align: center; + .past-set-result { + font-size: 1.2em; + margin: 5px 0; } - .set-result { + .stats { + text-align: center; font-size: 1.2em; + margin: 20px 0; }

Volleyball Scoreboard

+ +
Score: {{ summary_data[-1].set_score }}
-
- Sets Played: {{ summary_data[-1].last_set_number }} -
-
-
Timeouts Called: {{ summary_data[-1].timeouts_called }}
-
Substitutions Done: {{ summary_data[-1].substitutions_done }}
-
Video Checks Called: {{ summary_data[-1].video_checks_called }}
+ + +
+
Current Set: {{ summary_data[-1].current_set }}
+
{{ summary_data[-1].team_set_wins }}
+
Timeouts: {{ summary_data[-1].timeouts.home }} - {{ summary_data[-1].timeouts.away }}
+
Video Checks: {{ summary_data[-1].video_checks.home }} - {{ summary_data[-1].video_checks.away }}
+
Substitutions: {{ summary_data[-1].substitutions.home }} - {{ summary_data[-1].substitutions.away }}
- -
-

Set Results:

- {% for set_number, result in summary_data[-1].set_scores.items() %} -
- Set {{ set_number }}: {{ result.winning_team }} won with a score of {{ result.score }} -
+ +
+

Past Sets

+ {% for score in summary_data[-1].past_set_scores %} +
{{ score }}
{% endfor %}